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:
- FAB no vuelve a bajar
- 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()