How to dismiss a Snackbar using it's own Action button?

前端 未结 6 1218
没有蜡笔的小新
没有蜡笔的小新 2020-12-13 11:53

Android design support library now includes support for Snackbar.

I\'ve used the following code to create one:

Snackbar.make(findViewById(R.id.root_l         


        
相关标签:
6条回答
  • 2020-12-13 12:09

    Snackbar (from 'com.android.support:design:23.2.1') support many types of dismiss action. You can create a simple filter by using event, such as in this example:

    Snackbar.make(view, wornMessage, Snackbar.LENGTH_LONG).setActionTextColor(context.getResources().getColor(R.color.primary))
        .setCallback(new Snackbar.Callback() {
            @Override
            public void onShown(Snackbar snackbar) {
                super.onShown(snackbar);
            // when snackbar is showing
            }
    
            @Override
            public void onDismissed(Snackbar snackbar, int event) {
                super.onDismissed(snackbar, event);
                if (event != DISMISS_EVENT_ACTION) {
                   //will be true if user not click on Action button (for example: manual dismiss, dismiss by swipe
                }
            }
        })
        .setAction("Undo, view1 -> {
            // if user click on Action button
    }).show();
    

    Snackbar's dismiss types:

    /** Indicates that the Snackbar was dismissed via a swipe.*/
    public static final int DISMISS_EVENT_SWIPE = 0;
    /** Indicates that the Snackbar was dismissed via an action click.*/
    public static final int DISMISS_EVENT_ACTION = 1;
    /** Indicates that the Snackbar was dismissed via a timeout.*/
    public static final int DISMISS_EVENT_TIMEOUT = 2;
    /** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/
    public static final int DISMISS_EVENT_MANUAL = 3;
    /** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
    public static final int DISMISS_EVENT_CONSECUTIVE = 4;
    

    P.S. In sample code used lambda expressions (by RetroLambda)

    0 讨论(0)
  • 2020-12-13 12:14

    Implement a click action and let it empty . Clicking on empty click action will dismiss snackbar .

    Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG)
        .setAction("DISMISS", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        })
        .show();
    
    0 讨论(0)
  • 2020-12-13 12:16

    This is an old question, but I just want to share my own experience around similar feature on Snackbar. So we got a design for our app, that snackbar should be shown indefinitely and user should be able to dismiss it.. but there shouldn't be DISMISS button inside it (Google is not recommending Dismiss or Cancel actions inside snackbars anyway). Our snackbar had to be dismissed just by tapping on it.

    The only solution, working for us, was in the end (I am using retrolambda here, but standard View.OnClickListener could be used as well):

    final Snackbar snack = ... /* create proper snackbar as alway */
    snack.getView().setOnClickListener(v -> snack.dismiss());
    

    Note getView() call in the middle.

    0 讨论(0)
  • 2020-12-13 12:24

    When you use Snackbar.LENGTH_LONG you do not need action button for dismiss , after second automatically dismiss. You should use this code :

     Snackbar snackbar = Snackbar.make(relativeLayout, "Your Message", Snackbar.LENGTH_INDEFINITE);
                snackbar.setAction("dismiss", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        snackbar.dismiss();
                    }
                });
    
                snackbar.show();
    

    Be careful this line :

    Snackbar.LENGTH_INDEFINITE
    
    0 讨论(0)
  • 2020-12-13 12:26

    For Java,

    The .make method returns a Snackbar object. Save an instance of that object by making it final. Then, in the onClick(), call .dismiss:

    final Snackbar snackBar = Snackbar.make(findViewById(android.R.id.content), "Snackbar Message", Snackbar.LENGTH_LONG);
    
            snackBar.setAction("Action Message", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Call your action method here
                    snackBar.dismiss();
                }
            });
            snackBar.show();
    

    For Kotlin,

            Snackbar.make(
                findViewById(android.R.id.content),
                "Snackbar Message",
                Snackbar.LENGTH_INDEFINITE
            ).setAction("Action Message") {
                // Call action functions here
            }.show()
    
    0 讨论(0)
  • 2020-12-13 12:26

    I had the same problem. When I used .dismiss() the animations looked different and there were two problems:

    1. FAB does not go down again
    2. the SnackBar itself does not slide down like it would on a Click

    Looking into the original Android Source Code for Snackbar I found the following solution:

    View snackbarView = snackbar.getView();
    Button snackbarActionButton = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);
    //snackbarActionButton.setSoundEffectsEnabled(false); // might be considered in order not to have a confusing sound because nothing was clicked by the user
    

    Then, I would call the .performClick on the snackBarActionButton

    snackBarActionButton.performClick();
    

    Link to the Android Source Code for Snackbar: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java

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