support studio stackoverflow snack personalizar example bar android android-snackbar

android - studio - snackbar api level



¿Cómo descartar un Snackbar usando su propio botón de acción? (6)

Cuando usa Snackbar.LENGTH_LONG no necesita un botón de acción para descartar, después de un segundo descarte automático. Deberías usar este código:

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

Ten cuidado con esta línea :

Snackbar.LENGTH_INDEFINITE

La biblioteca de soporte de diseño de Android ahora incluye soporte para Snackbar.

He usado el siguiente código para crear uno:

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

El snackbar puede ser descartado por un golpe. Sin embargo, también quiero descartarlo usando su propio botón de acción (creado usando la función setAction).

Sin embargo, no parece haber ninguna función disponible que pueda hacer eso.


Esta es una vieja pregunta, pero solo quiero compartir mi propia experiencia en torno a características similares en Snackbar. Así que obtuvimos un diseño para nuestra aplicación, que snackbar debería mostrarse indefinidamente y el usuario debería poder descartarlo ... pero no debería haber un botón DISMISS dentro de él (Google no está recomendando acciones de Descartar o Cancelar dentro de snackbars de todos modos). Nuestro snackbar tuvo que ser descartado con solo tocarlo.

La única solución que funcionó para nosotros fue al final (estoy usando retrolambda aquí, pero también se podría usar View.OnClickListener estándar):

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

Tenga en cuenta la llamada getView () en el medio.


Implemente una acción de clic y déjelo vaciar. Al hacer clic en una acción de clic vacía, se descartará snackbar

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


Snackbar (de ''com.android.support:design:23.2.1'' ) admite muchos tipos de acciones de descarte. Puede crear un filtro simple usando evento , como en este ejemplo:

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

Tipos de descarte de Snackbar:

/** 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;

PD: en el código de muestra se utilizan expresiones lambda (por RetroLambda)


Yo tuve el mismo problema. Cuando usé .dismiss () las animaciones se veían diferentes y había dos problemas:

  1. FAB no vuelve a bajar
  2. la SnackBar en sí no se desliza hacia abajo como lo haría con un clic

Buscando en el código fuente original de Android para Snackbar encontré la siguiente solución:

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

Entonces, llamaría al .performClick en el snackBarActionButton

snackBarActionButton.performClick();

Enlace al código fuente de Android para Snackbar: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java


Para Java

El método .make devuelve un objeto Snackbar . Guarde una instancia de ese objeto haciéndolo final . Luego, en onClick() , llame a .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();

Para Kotlin

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