android - studio - snackbar material design
¿Cómo puedo ser notificado cuando un Snackbar se ha descartado? (10)
Estoy usando un Snackbar de la biblioteca
com.android.support:design:22.2.0
.
Lo estoy usando para deshacer eliminaciones.
Para hacerme la vida más fácil, voy a hacer que la IU parezca que las cosas realmente se borraron de la fuente de datos, y si no se presiona el botón Deshacer en la barra de bocadillos, realmente realizo las eliminaciones de la fuente de datos.
Por lo tanto, quiero saber cuándo Snackbar ya no está visible, por lo que es seguro eliminar los elementos.
Puedo llamar a getView () en Snackbar, pero no estoy seguro de qué oyente debería estar usando.
Intenté
setOnSystemUiVisibilityChangeListener()
pero eso no funcionó, creo que es solo para la barra de estado del sistema.
Además, Snackbar no se puede extender, ya que tiene un constructor privado.
Actualmente no hay forma de recibir notificaciones cuando Snackbar ha terminado de mostrarse.
En este hilo se discute una solución alternativa basada en un temporizador para la duración de la visualización de Snackbar. ¿Snackbar en Support Library no incluye OnDismissListener ()?
Una cuestión a considerar con esta solución es que es posible que se reinicie la duración de Snackbar. La especificación de diseño de material para Snackbar dice que esto sucederá si se muestra un cuadro de diálogo o ventana emergente no relacionada.
Actualmente no puedes lograrlo.
No se llama a un oyente cuando el snackbar está empañado.
La forma más fácil de hacerlo es guardar temporalmente el registro en otro lugar (incluso una variable local), luego volver a insertarlo si presiona el botón Deshacer.
La biblioteca de diseño de Google admite las devoluciones de llamada de Snackbar en la versión 23. Consulte los documentos de Snackbar y los documentos de devolución de llamada . Luego se le notificará cuando se descarte Snackbar (y también cuando se muestre) y también el tipo de despido si esto es útil para usted:
snackbar.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
//see Snackbar.Callback docs for event details
...
}
@Override
public void onShown(Snackbar snackbar) {
...
}
});
Para recibir una notificación cuando se muestre o se descarte un snackbar, puede proporcionar un Snackbar.Callback a través de setCallback (Callback).
Recientemente me topé con este asunto cuando me desplacé y mostré Snackback, se mostraron demasiados antes de que el primero desapareciera. Tenía que encontrar una manera de saber si la aplicación debería haber puesto el Snackbar.
Personalmente encontré esta solución.
Es cierto que Snackbar en sí no ofrece ningún tipo de oyente por su estado / visibilidad, pero aún puede obtener el objeto de visualización de Snackbar (getView ();). Desde View Object tiene la oportunidad de usar una amplia variedad de métodos para agregar oyentes.
Para implementarlo, tiene que salir del uso común de Toast / Snackbar "todo en una línea", porque agregar oyentes devuelve nulo .
Personalmente encontré OnAttachStateChangeListener para satisfacer mis necesidades.
Dejar caer un snipper con mi código en caso de que pueda resultarle útil.
Snackbar snack = Snackbar.make(getView(), "My Placeholder Text", Snackbar.LENGTH_LONG);
snack.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
canDisplaySnackbar = false;
}
@Override
public void onViewDetachedFromWindow(View v) {
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
canDisplaySnackbar = true;
}
}, 1000);
}
});
snack.show();
Tenga en cuenta que esta es solo mi implementación para mi propio problema, el controlador con un PostDelayed Runnable puede que ni siquiera se ajuste a su caso. Fue solo para dar una idea general de la implementación que sugerí usando un fragmento que ya poseo.
Snackbar.addCallback en kotlin
val snackBar = Snackbar
.make(view, "Text Snackbar", Snackbar.LENGTH_LONG)
.addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
override fun onShown(transientBottomBar: Snackbar?) {
super.onShown(transientBottomBar)
}
override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
super.onDismissed(transientBottomBar, event)
}
})
val snackBarView = snackBar.view
snackBarView.setBackgroundColor(Color.RED)
snackBar.show()
onDismissed también se llama cuando se hace clic en el texto de la acción por ese motivo necesita poner una condición como
event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT
Y ahora el nuevo código se ve a continuación.
final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG);
snackbar.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
// Snackbar closed on its own
}
}
@Override
public void onShown(Snackbar snackbar) {
...
}
});
snackBar.show();
setCallback
ahora está en desuso y se debe usar
addCallback
snackbar.addCallback(new Snackbar.Callback() {
public void onShown(Snackbar snackbar) {
// on show
}
public void onDismissed(Snackbar snackbar, int event) {
// on dismiss
}
});
snackbar.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
// Snackbar closed on its own
}
}
@Override
public void onShown(Snackbar snackbar) {
...
}
});