web-dev-qa-db-fra.com

Comment congédier une barre de frites en utilisant son propre bouton Action?

La bibliothèque de support de conception Android inclut désormais le support de Snackbar.

J'ai utilisé le code suivant pour en créer un:

Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG)
        .setAction("Dismiss", new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        }).show();

Le snack-bar peut être écarté par un coup. Cependant, je souhaite également le supprimer à l'aide de son propre bouton d'action (créé à l'aide de la fonction setAction).

Cependant, aucune fonction ne semble pouvoir le faire.

76
Asim

pour Java

La méthode .make Renvoie un objet Snackbar. Enregistrez une instance de cet objet en le rendant final. Ensuite, dans la onClick(), appelez .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();

pour Kotlin

        Snackbar.make(
            findViewById(Android.R.id.content),
            "Snackbar Message",
            Snackbar.LENGTH_INDEFINITE
        ).setAction("Action Message") {
            // Call action functions here
        }.show()
128
EE66

Implémentez une action de clic et laissez-la vide. En cliquant sur l'action de clic vide, le snackbar disparaîtra.

Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG)
    .setAction("DISMISS", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        }
    })
    .show();
48
Ali Zarei

Quand vous utilisez Snackbar.LENGTH_LONG vous n’avez pas besoin du bouton d’action pour la révocation, après la seconde automatiquement. Vous devriez utiliser ce 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();

Attention cette ligne:

Snackbar.LENGTH_INDEFINITE
10
hamed golbahar

C'est une vieille question, mais je veux juste partager ma propre expérience autour d'une fonctionnalité similaire sur Snackbar. Donc, nous avons un design pour notre application, ce snack-bar devrait être affiché indéfiniment et l'utilisateur devrait pouvoir le rejeter .. mais il ne devrait pas y avoir de bouton ANNULER à l'intérieur (Google ne recommande de toute façon pas les actions Ignorer ou Annuler dans les snack-bars). Notre snack-bar a dû être congédié simplement en tapotant dessus.

La seule solution qui fonctionnait pour nous était finalement (j'utilise retrolambda ici, mais le standard View.OnClickListener peut également être utilisé):

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

Remarque getView () appel au milieu.

5
Dariusz Wiechecki

J'ai eu le même problème. Lorsque j’utilisais .dismiss (), les animations étaient différentes et il y avait deux problèmes:

  1. FAB ne redescend pas
  2. le SnackBar lui-même ne glisse pas comme il le ferait sur un clic

En regardant dans l'original Android code source pour Snackbar j'ai trouvé la solution suivante:

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

Ensuite, j'appellerais le .performClick sur le snackBarActionButton

snackBarActionButton.performClick();

Lien vers le Android Code source du Snackbar: https://Android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/ Android/support/conception/widget/Snackbar.Java

2

Snackbar (from 'com.Android.support:design:23.2.1') prend en charge de nombreux types d’actions de rejet. Vous pouvez créer un filtre simple en utilisant event, comme dans cet exemple:

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

Types de licenciement du snack-bar:

/** 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. Dans les exemples de code utilisés, expressions lambda (par RetroLambda)

1
a.black13