如何在全局侦听器中实现小吃吧?

Posted

技术标签:

【中文标题】如何在全局侦听器中实现小吃吧?【英文标题】:How do I implement a snackbar in a global listener? 【发布时间】:2016-03-17 23:05:41 【问题描述】:

我在主要活动中使用事件侦听器来确定与数据库的网络连接

//Main Activity

    new MyListener() 
        if (connected) 
            Log.d(TAG,"connected");
            Snackbar.make(_current_view_,"Connected to Firebase", Snackbar.LENGTH_SHORT).show();
       
       else 
            Log.d(TAG,"disconnected");
            Snackbar.make(__current_view_, "Disconnected from Firebase", Snackbar.LENGTH_SHORT).show();
               
    );

现在,由于这是主活动中的侦听器,因此每次网络连接发生变化时,都会优雅地调用它。但我需要一个视图 应用程序正在呈现的当前活动。

如何获得当前视图?监听器工作并且日志记录是完美的,但是没有调用 Snackbar,因为我们不在主要活动的布局上。但是,当我们这样做时,会显示小吃店。 是否可以获取当前视图的参考?

当我将 SnackBars 替换为 Toasts 时,它们可以完美地与日志协同工作。

Toast.makeText(Login.this, "Connected to Firebase", Toast.LENGTH_SHORT).show(); //Works

我试过了:

getCurrentFocus()
findViewbyId(android.R.id.content)
getWindow().getDecorView()
getWindow().getDecorView().getRootView()

没有,其中一个有效。任何帮助将不胜感激。

【问题讨论】:

你能提供更多关于你的架构的信息吗? MainActivity 是 Fragments 的宿主吗?当前视图是什么意思?如果 Activity 不在前台,你如何让 MyListener 的方法工作? 好点。侦听器是一个 firebase 数据库侦听器,一旦注册,它就会一直保持到显式删除。它可以跨活动无缝工作。当我使用 Toasts 时,它工作得很好。这只是主要活动,没有任何片段的宿主。 【参考方案1】:

因此,在您发表评论后,我的理解是,虽然不是 Firebase 专家,但您可能应该在 onResume 中注册您的侦听器并在 onPause 中取消注册。所以你不会在那里发生任何冲突。

但是关于解决方案,您需要以相同的方式注册所有活动。因此,如果您从 MainActivity 导航到 Activity-A,然后在 MainActivity 的 onPause 中,取消注册您的侦听器。在 Activity-A 中,在该新 Activity 的 onResume 中注册您的数据库侦听器。因此,您将获得当前活动和当前视图。您的侦听器将调用堆栈上最近的 Activity,而不是一直保持 MainActivity 的实例。这可能会导致其他问题。

如果上述解决方案对您不利,并且您只需要当前视图,为什么不每次更改堆栈中的顶部活动时保存当前视图。您可以在 Application 类中有一个视图对象,您可以在其中静态访问。您可以在应用程序类中创建静态 getter 和 setter 方法。但我仍然不确定这是否是更好的方法。在应用程序类中保留一个静态视图实例。

【讨论】:

我希望我能解释一下,但是考虑到 SnackBar 的功能可以用 Toast 代替,因此多次注册和注销网络侦听器效率低下。必须有替代方案 嗯,当然还有其他选择。但我想以更好的方式做到这一点。查看我编辑的答案。

以上是关于如何在全局侦听器中实现小吃吧?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中实现一个数据库监听器

如何在 Angular 小吃店中禁用背景?

尝试在片段中实现 OnClick 侦听器 [重复]

如何以 xamarin 形式在屏幕顶部显示小吃店或烤面包

如何在重力加速度监听器中实现button被按下的逻辑?

如何在android中实现长按屏幕?