【问题标题】:Snackbar: how to identify which snackbar is shownSnackbar:如何识别显示的是哪个snackbar
【发布时间】:2016-04-05 11:13:27
【问题描述】:

我有一个实现swipetorefresh 布局的recyclerview - 如果您在列表中向下滑动手指,它将加载较新的帖子。它还有一个 onloadmorelistener 用于对我的回收站视图进行分页 - 如果您在回收站视图上滑动手指,它将加载较旧的帖子。

我正在尝试构建一个snackbar 通知,如果用户离线并且他尝试完成某种类型的网络活动,例如加载旧帖子或新帖子,则会出现小吃栏告诉他“没有互联网”。

在没有互联网的情况下,用户在 recyclerview 上向上滑动和向下滑动,会显示两个显示相同“无互联网”消息的小吃店通知。实际上,我只想显示一个。

因此,我正在寻找一些独特的方法来识别小吃栏中显示的文本,这样如果两个小吃栏中的文本相同,则只会显示一个小吃栏,但小吃栏中没有 getText() 方法而且只有setText():http://developer.android.com/intl/es/reference/android/support/design/widget/Snackbar.html

我还看到有回调方法:http://developer.android.com/intl/es/reference/android/support/design/widget/Snackbar.Callback.html,但在我的场景中似乎没有任何帮助。

我希望有一个独特的标志,当它被创建用于识别目的时,我可以给它,但 Snackbar.make 方法不允许这样做。

有没有人成功解决过类似的问题?

【问题讨论】:

    标签: android android-snackbar


    【解决方案1】:

    使用小吃吧回调。例如,当它显示时将其添加到列表中,然后在调用回调时将其删除,因此您只有仍然可见的小吃店。回调示例:

    snackbar.setCallback(new Snackbar.Callback() {
    
        @Override
        public void onDismissed(Snackbar snackbar, int event) {
          //see Snackbar.Callback docs for event details
          ...  
        }
    
        @Override
        public void onShown(Snackbar snackbar) {
           ...
        }
      });
    

    【讨论】:

    • 不确定您的意思是将小吃店添加到列表中...当有多个小吃店并且您需要确定显示哪一个以防止显示两个类似的小吃店时,这有什么帮助?例如,您可能有两个“无互联网”小吃店和一个“撤消”小吃店,您如何只显示一个“无互联网小吃店”和一个“撤消”小吃店?我找不到唯一识别哪个小吃店的方法3 家小吃店中的一家。
    • 您可以使用 Hashmap 代替,其中键是显示的消息,因此每次启动快餐栏时,您都会检查与键匹配的值是空的还是忙碌的。这样,您仅在 Hashmap 中的关联对具有空值时才启动小吃吧
    • setCallback 已弃用。请改用addCallback
    【解决方案2】:

    我会尽量把 Helmi 说的写在代码上

    private Map<String, String> snackbarList = new HashMap<>();
    private CoordinatorLayout mCoordinatorLayout;
    
    private void displaySnackbarIfNotShown(String snackbarText) {
        //Check if the snackbar is already on the list
        if(snackbarList.containsKey(snackbarText)){
            //Snackbar already exist, you may update its text or ignore it
        } else {
            Snackbar mySnackbar = Snackbar.make(mCoordinatorLayout, R.string.prompt_adjust_map,
                                                Snackbar.LENGTH_INDEFINITE);
    
            mySnackbar.setCallback(new Snackbar.Callback() {
                @Override
                public void onDismissed(Snackbar snackbar, int event) {
                    //Remove from the snackbar list
                    snackbarList.remove(snackbarText);
                }
    
                @Override
                public void onShown(Snackbar snackbar) {
                    //Add to the snackbar list
                    snackbarList.put(snackbarText, "");
                }
            });
            mySnackbar.show(); 
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 2019-12-15
      • 2019-08-28
      • 1970-01-01
      • 2020-09-24
      • 2017-11-23
      • 2019-08-28
      • 2021-03-11
      • 2015-09-07
      相关资源
      最近更新 更多