¿Cómo puedo ser notificado cuando una Snackbar se ha despedido?

Estoy usando una Snackbar de la biblioteca com.android.support:design:22.2.0 . Lo estoy usando para deshacer borrados. Para hacer mi vida más fácil, voy a hacer que la interfaz de usuario parezca que las cosas realmente se eliminan de la fuente de datos, y si el botón de deshacer en la barra de snack no se presiona, en realidad realizar las supresiones de la fuente de datos. Por lo tanto, quiero saber cuando la Snackbar ya no es visible, por lo que es seguro eliminar los elementos.

Puedo llamar a getView () en el Snackbar, pero no estoy seguro de qué oyente debería estar usando. He intentado setOnSystemUiVisibilityChangeListener() pero que no funcionó, creo que es sólo para la barra de estado del sistema.

Además, Snackbar no se puede ampliar, ya que tiene un constructor privado.

La biblioteca de diseño de Google admite las devoluciones de llamada de Snackbar en la versión 23. Vea Documentos de la barra de tareas y Documentos de devolución de llamada . A continuación, se notificará cuando el Snackbar se despide (y también cuando se muestra) 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) { ... } }); 

Recientemente tropecé en este asunto yo mismo cuando para desplazamiento y mostrando Snackback, demasiados se mostraron antes de la primera incluso desapareció. Tuve que encontrar una manera de saber si la aplicación debería haber establecido la Snackbar.

Personalmente he encontrado esta solución.

Es cierto Snackbar en sí no ofrece ningún tipo de oyente para su estado / visibilidad, pero todavía puede obtener el objeto de vista fuera de Snackbar (getView ();). Desde el objeto de visualización tiene la oportunidad de utilizar una amplia variedad de métodos para agregar oyentes.

Para implementarlo tiene que salir de la común "todo en una línea" Toast / Snackbar uso, porque la adición de oyentes devuelve void .

Personalmente, encontré OnAttachStateChangeListener para satisfacer mis necesidades.

Dejar caer un snipper con mi código en caso de que pueda resultar útil para usted.

 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 esto es sólo mi implementación para mi propio problema, manejador con un RunDable de postDelayed podría incluso no encajar su caso. Fue sólo para dar una idea general de la implementación que sugerí usar un fragmento que ya tengo.

Para ser notificado cuando se ha mostrado o rechazado un snackbar, puede proporcionar una Snackbar.Callback a través de setCallback (Callback).

  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) { ... } }); 

Actualmente no hay manera de obtener notificación cuando la Snackbar ha terminado de mostrar.

En este subproceso se discute una solución en función de un temporizador durante la duración de la visualización de Snackbar. Snackbar en la biblioteca de soporte no incluye OnDismissListener ()?

Un problema a considerar con esta solución es que es posible que la duración de Snackbar se reinicie. La especificación de diseño de material para Snackbar dice que esto sucederá si se muestra un cuadro de diálogo o popup no relacionado.

Actualmente no se puede lograr.

No hay un oyente llamado cuando el snackbar es dimissed.

La forma más sencilla de hacerlo es guardar temporalmente el registro en otro lugar (incluso una variable local) y, a continuación, volver a insertarlo si suceden al pulsar el botón de deshacer.

  • Cómo deshabilitar el comportamiento de "snack-to-dismiss"
  • ¿Cómo puedo cambiar la alineación inicial de Android Snackbar de abajo hacia arriba?
  • Acción Snackbar getView ()
  • Cómo personalizar el diseño de snackBar?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.