android - libreria - snackbar material design
Biblioteca de soporte de Android Snackbar con longitud indefinida (4)
Snackbars automáticamente tiempo fuera de la pantalla. No deben ser persistentes o apilados, ya que están por encima de otros elementos en la pantalla.
Por lo tanto, Snackbars parece ser inadecuado para su caso de uso de notificación a los usuarios hasta que el usuario haga algo para descartarlo.
En su lugar, deberías considerar usar Dialog
Los diálogos siempre conservan el enfoque hasta que se desactiva o se toma una acción requerida
Para más información, consulte:
Veo que el Snackbar solo tomará LENGTH_LONG o LENGTH_SHORT cuando determine la longitud de su visualización en la pantalla.
Me gustaría que se muestre hasta que alguien lo saque de la pantalla. Esto es para algunos casos en los que tiene errores persistentes, como cuando no tiene Internet y desea notificar al usuario sin que desaparezca de la pantalla después de 2750 ms al seleccionar LONGITUD_LONG.
Por supuesto, puedo usar setDuration a valores de milisegundos ridículamente largos, pero ¿no hay forma de configurarlo para que no desaparezca hasta que el usuario lo descarte?
Estoy usando com.android.support:appcompat-v7:26.1.0 y Snackbar.LENGTH_INDEFINITE
funciona como debería ser. Una muestra podría ser como la siguiente:
private HashMap<Long, Snackbar> mTokenSnackbarMap = new LinkedHashMap<>();
private void dropPoint(@NonNull Location location) {
final Long token = SystemClock.elapsedRealtime();
// <submitPoint> is the callback to be executed
// at a time in the future, if the "cancel" button
// of the Snackbar isn''t clicked until that time.
Runnable submitPoint = () -> {
Snackbar bar = mTokenSnackbarMap.get(token);
if (bar != null) {
// "cancel" button of the Snackbar wasn''t clicked,
// but our time is up. Dismiss the Snackbar.
bar.dismiss();
mTokenSnackbarMap.remove(token);
Log.i(TAG, "dropPoint: dismiss snackbar");
}
mDatabase.add(Point.Factory.create(uid, location));
Log.i(TAG, "dropPoint: addPoint");
};
// The indefinite Snackbar allowing arbitrary cancellation.
Snackbar snackbar = Snackbar.make(mMainView, R.string.point_pending, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.cancel, (v) -> {
mTokenSnackbarMap.remove(token);
mUiHandler.removeCallbacks(submitPoint, token);
Log.i(TAG, "dropPoint: cancel snackbar");
});
mTokenSnackbarMap.put(token, snackbar);
mUiHandler.postAtTime(submitPoint, token,
SystemClock.uptimeMillis() + Constants.POINT_DELAY_MILLIS);
Log.i(TAG, "dropPoint: postAtTime");
snackbar.show();
}
ACTUALIZACIÓN: como se mencionó, ahora es posible con el lanzamiento de la biblioteca de soporte de Android 22.2.1, use el indicador LENGTH_INDEFINITE
No es posible configurar una visualización indefinida de un Snackbar cuando se utiliza la implementación oficial de la biblioteca de Soporte de diseño de Android.
Si bien esto puede violar la filosofía de Diseño de Materiales de un Snackbar, existen implementaciones de Snackbar de terceros que sí lo permiten. Aquí hay un ejemplo:
https://github.com/nispok/snackbar
Este proyecto permite los siguientes valores para la duración de la visualización:
LENGTH_SHORT: 2s
LENGTH_LONG: 3.5s (default)
LENGTH_INDEFINTE: Indefinite; ideal for persistent errors
Tenga en cuenta que este proyecto ya no se está desarrollando debido al lanzamiento de la implementación oficial de Snackbar.
La última versión de la biblioteca de soporte de Android ( 22.2.1 ), ahora incluye LENGTH_INDEFINITE
.
Lo siguiente mostrará el Snackbar hasta que se cierre o se muestre otro Snackbar.
Snackbar.make(view, "Your Snackbar", Snackbar.LENGTH_INDEFINITE)
.setAction("Your Action", null).show();