Android 在任何活动中显示snackbar

Android 在任何活动中显示snackbar,android,android-snackbar,Android,Android Snackbar,我的android应用程序中有四项活动 main活动-->列表文件活动-->显示文件活动-->编辑文件活动 我的应用程序已连接到服务器,允许使用该应用程序的最长时间为30分钟(此值可以更改,具体取决于服务器策略) 服务器在用户登录后20分钟(您还有10分钟)和25分钟(您还有5分钟)内向客户端发送超时余数 如果用户在接收时刻处于main活动中(我收到消息并显示一个带有服务器消息的snackbar),则工作正常 更多详情: (我有一个java类监听器,它监听来自服务器的消息,当它收到消息时,调用M

我的android应用程序中有四项活动

main活动-->列表文件活动-->显示文件活动-->编辑文件活动

我的应用程序已连接到服务器,允许使用该应用程序的最长时间为30分钟(此值可以更改,具体取决于服务器策略)

服务器在用户登录后20分钟(
您还有10分钟)和25分钟(
您还有5分钟)内向客户端发送超时余数

如果用户在接收时刻处于main活动中(我收到消息并显示一个带有服务器消息的snackbar),则工作正常

更多详情:

(我有一个java类监听器,它监听来自服务器的消息,当它收到消息时,调用MainActivity函数并显示snackbar)

使用这种方式是不正确的,因为我只能调用一个活动来显示snackbar

我的问题是如何使用全局snackbar,这样应用程序将在任何活动中显示snackber,这样用户就可以始终看到显示的消息

是否可以使用snackbar(或者使用其他信息显示器类型更好)


如果没有,您知道如何处理它吗?

这个想法是创建一个全局的
方法,其他四个类都可以访问它。。。
我没有试过,所以不确定,但是
我希望这能奏效:

public void globalSnackbar(String time) {
  View rootView = findViewById(android.R.id.content);
  if(rootView != null) {
    Snackbar.make(rootView, time, Snackbar.LENGTH_SHOW).show(); 
  }
}

然后在其他活动中调用
globalsnakbar

不可能在多个活动或片段中显示相同的Snackbar,因为Snackbar与启动它的视图紧密耦合。因此,无论何时离开该视图,Snackbar都将消失


我建议改为使用Toast消息,它将显示在不同的活动、片段和视图上,并且不会在导航过程中消失。

snackbar取决于视图。您可以创建一个BaseActivity类并使您的所有活动继承自该类,然后您可以使用如下方法显示任何活动的snackbar:

protected void showSnackbar(View view, String text) {
  if(view != null) {
    Snackbar.make(view, text, Snackbar.LENGTH_SHOW).show(); 
  }
}

另一种选择是使用一个活动和四个片段

我是这样做的

我声明了两个全局静态布尔值

boolean msgFiveMinReceived = false; // default
boolean msgTenMinReceived = false; // default
当我的侦听器类收到服务器消息时(例如,还剩10分钟)

在每个活动中,我都运行一个线程函数来检查布尔值

    Public void checkMessage() {
            new Thread() {
                public void run() {
                    int i = 0;
                    while (i++ < 100000) {
                        try {
if(msgTenMinReceived ) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {

     // display snackbar

    }
        // set msgTen to false                           
    }
                            });
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
Public void checkMessage(){
新线程(){
公开募捐{
int i=0;
而(i++<100000){
试一试{
如果(msgTenMinReceived){
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//显示快捷键
}
//将msgTen设置为false
}
});
睡眠(10000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
}.start();

谢谢,我会尝试一下,让你知道我想我应该与你分享更多信息,我会编辑我的问题,我会尝试使用其他建议(snackbar),如果不起作用,我会接受你的回答,谢谢你这么好的想法,但这在我的情况下是不可能的。谢谢如果你使用ViewModel来显示snackbar,你可以在所有活动之间共享你的ViewModel并观察LiveData来显示它。你能给我更多的细节吗?你可以用LiveData创建一个观察监听器类中的另一个LiveData。所有活动都必须观察LiveData。当监听器类收到数据时,必须初始化从ViewModel LiveData观察到的LiveData,并且活动可以显示snackbar。@Manuel Mato,片段本身就是一个视图,从中导航时snackbar将消失从一个片段到另一个片段的活动。
    Public void checkMessage() {
            new Thread() {
                public void run() {
                    int i = 0;
                    while (i++ < 100000) {
                        try {
if(msgTenMinReceived ) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {

     // display snackbar

    }
        // set msgTen to false                           
    }
                            });
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();