【问题标题】:Display snackbar in any activity在任何活动中显示小吃吧
【发布时间】:2020-05-03 17:02:47
【问题描述】:

我的 Android 应用中有四个活动。

MainActivity-->ListFilesActivity-->DisplayFileActivity-->EditFileActivity.

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

服务器在用户登录后的 20(you have 10 min left)和 25(you have 5min left)分钟内向客户端发送超时剩余。

如果用户在接收时处于 MainActivity 中,则工作正常(我收到消息并显示带有服务器消息的小吃栏)。

更多细节:

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

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

我的问题是如何使用全局snackbar,所以应用程序会在任何activity中显示snackber,这样用户总是可以看到显示的消息。

是否可以使用快餐栏(或者使用其他信息显示类型更好)?

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

【问题讨论】:

    标签: android android-snackbar


    【解决方案1】:

    我们的想法是创建一个可供其他四个类访问的全局Method... 我没试过所以不确定但是 我希望这会奏效:

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

    然后在其他活动中调用globalSnackbar

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我会尝试与其他提议(snackbar)合作,如果不行,我会接受你的回答,非常感谢
      【解决方案3】:

      snackbar 依赖于一个视图。您可以创建一个 BaseActivity 类并让您的所有活动都继承自它,然后您可以使用以下方法从任何活动中显示小吃栏:

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

      【讨论】:

      • 谢谢你,我会试试,让你知道
      • 我想我应该和你分享更多信息,我会编辑我的问题
      【解决方案4】:

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

      【讨论】:

      • 好主意,但在我的情况下这是不可能的。谢谢
      • 如果您使用 ViewModel 来显示快餐栏,您可以在所有活动之间共享您的 ViewModel 并观察 LiveData 以显示它。
      • 你能给我更多的细节吗?
      • 您可以创建一个带有 LiveData 的 ViewModel,它可以观察您的侦听器类中的另一个 LiveData。所有活动都必须观察实时数据。当您的侦听器类收到数据时,必须初始化从 ViewModel LiveData 观察到的 LiveData,并且可以显示该活动。
      • @Manuel Mato, Fragment 本身就是一个视图,当从 Activity 导航到 Fragment 和从 Fragment 导航到 Fragment 时,snackbar 会消失。
      【解决方案5】:

      我是这样做的。

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

      boolean msgFiveMinReceived = false; // default
      boolean msgTenMinReceived = false; // default
      

      当我的 Listener 类收到服务器消息时(例如还剩 10 分钟)

      msgTenMinReceived = true;
      

      在每个 Activity 中,我运行一个检查布尔值的线程函数

          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();
      

      【讨论】:

        猜你喜欢
        • 2020-10-18
        • 2017-10-30
        • 2021-11-04
        • 2020-03-05
        • 2021-02-27
        • 2021-10-24
        • 2020-09-07
        • 2018-07-03
        • 2019-07-25
        相关资源
        最近更新 更多