How can I be notified when a Snackbar has dismissed itself?

前端 未结 12 1507
陌清茗
陌清茗 2020-12-01 00:24

I\'m using a Snackbar from the com.android.support:design:22.2.0 library. I\'m using it to undo deletions. To make my life easier, I\'m going to make the UI loo

相关标签:
12条回答
  • 2020-12-01 01:03
        snackbar.addCallback(new Snackbar.Callback() {
            public void onShown(Snackbar snackbar) {
               //  on show  
            }
     public void onDismissed(Snackbar snackbar, int event) {
              //  on dismiss  
            }
          });
    
    0 讨论(0)
  • 2020-12-01 01:07

    Recently I stumbled upon this matter myself when for scrolling and showing Snackback, too many were shown before the first even disappeared. I had to find a way to know if the app should have laid down the Snackbar.

    I personally found this solution.

    It is true Snackbar itself does not offer any kind of listener for it's state/visibility, but you can still get the View Object out of Snackbar ( getView(); ). From the View Object you have the chance to use a wide variety of methods to add listeners.

    To implement it you have to go out of the common "all-in-one-line" Toast/Snackbar usage, because adding listeners returns void .

    I personally found OnAttachStateChangeListener to fulfill my needs.

    Dropping a snipper with my code in case it might turn useful for you.

    Snackbar snack = Snackbar.make(getView(), "My Placeholder Text", Snackbar.LENGTH_LONG);
    
    snack.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
        @Override
            public void onViewAttachedToWindow(View v) {
                canDisplaySnackbar = false;
            }
    
        @Override
        public void onViewDetachedFromWindow(View v) {
    
            Handler h = new Handler();
            h.postDelayed(new Runnable() {
                @Override
                public void run() {
                    canDisplaySnackbar = true;
    
                    }
            }, 1000);
        }
    });
    snack.show();
    

    Please note that this is just my implementation for my own problem, Handler with a postDelayed Runnable might not even fit your case. It was just to give a general idea of the implementation I suggested using a snippet I already own.

    0 讨论(0)
  • 2020-12-01 01:08

    Google design library supports Snackbar callbacks in version 23. See Snackbar docs and Callback docs. You will then get notified when the Snackbar gets dismissed (and also when shown) and also the type of dismissal if this is useful for you:

    snackbar.addCallback(new Snackbar.Callback() {
    
        @Override
        public void onDismissed(Snackbar snackbar, int event) {
          //see Snackbar.Callback docs for event details
          ...  
        }
    
        @Override
        public void onShown(Snackbar snackbar) {
           ...
        }
      });
    
    0 讨论(0)
  • 2020-12-01 01:09

    setCallback is now deprecated and addCallback should be used

    https://developer.android.com/reference/android/support/design/widget/BaseTransientBottomBar.html#addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback)

    0 讨论(0)
  • 2020-12-01 01:14
    snackbar.addCallback(new Snackbar.Callback() {
    
        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
                // Snackbar closed on its own
            }
        }
    
        @Override
        public void onShown(Snackbar snackbar) {
            ...
        }
    });
    
    0 讨论(0)
  • 2020-12-01 01:18

    There is currently no way to get notification when the Snackbar has finished displaying.

    In this thread a workaround is discussed based on a timer for the duration of the Snackbar display. Snackbar in Support Library doesn't include OnDismissListener()?

    One issue to consider with this workaround is it is possible that the Snackbar duration is restarted. The material design specification for Snackbar says this will happen if an unrelated dialog or popup is displayed.

    0 讨论(0)
提交回复
热议问题