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.
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()
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();
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
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.
J'ai eu le même problème. Lorsque j’utilisais .dismiss (), les animations étaient différentes et il y avait deux problèmes:
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
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)