android - implement - snackbar js
Cómo usar el método setDuration() en SnackBar(Android Design Support Library) (7)
De la documentación: duración del parámetro: sea una de las longitudes predefinidas: LENGTH_SHORT, LENGTH_LONG o una duración personalizada en milisegundos . Pero no puedo establecer una duración personalizada.
Por ejemplo
Snackbar
.make(parentLayout, "Feed cat?", 8000) // try here
.setAction("Yes", snackOnClickListener)
.setActionTextColor(Color.MAGENTA)
.setDuration(8000) // try here
.show();
pero en vez de 8 segundos, Snackbar desapareció rápidamente.
Basado en la implementación de Snackbar
y SnackbarManager
, puedo confirmar la evaluación de Eugene H: es un error. De SnackbarManager
:
private void scheduleTimeoutLocked(SnackbarRecord r) {
mHandler.removeCallbacksAndMessages(r);
mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_TIMEOUT, r),
r.duration == Snackbar.LENGTH_LONG
? LONG_DURATION_MS
: SHORT_DURATION_MS);
}
Por lo tanto, cualquier valor que no sea LENGTH_LONG
resultado una LENGTH_LONG
de corta duración.
He archivado un problema al respecto.
Editar : se ha corregido en la revisión 22.2.1. Verifique las notas de la versión here
Los documentos de Android NO se han actualizado aún, pero si ingresas al código fuente notarás que el parámetro del método setDuration (int duration) puede ser uno de LENGTH_SHORT, LENGTH_LONG, LENGTH_INDEFINITE o una duración personalizada en milisegundos
Dado que ''com.android.support:design:22.2.1''
puede establecer la duración de su Snackbar en LENGTH_INDEFINITE
y mostrará la Snackbar hasta que se cierre o se muestre otra cafetería.
Establezca la duración inicial en LENGTH_INDEFINITE y luego configure su duración personalizada después:
Snackbar
.make(parentLayout, "Feed cat?", Snackbar.LENGTH_INDEFINITE)
.setAction("Yes", snackOnClickListener)
.setActionTextColor(Color.MAGENTA)
.setDuration(8000)
.show();
EDITAR
Establecer un período directamente en milisegundos ahora funciona;
Snackbar
.make(parentLayout, "Feed cat?", 8000)
.setAction("Yes", snackOnClickListener)
.setActionTextColor(Color.MAGENTA)
.show();
Este código funciona perfectamente para mí, prueba esto
Snackbar.make(view, "Hello SnackBar", Snackbar.LENGTH_LONG)
.setAction("Its Roy", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
})
.setDuration(10000)
.setActionTextColor(getResources().getColor(R.color.colorAccent))
.show();
He creado una solución para esto, hice una clase que establece snackbars con una duración personalizada usando handler y postDelayed:
public class SnackBarMaker {
public static void snack(View content, String message, String actionText, int actionTextColor, View.OnClickListener onClick){
Snackbar.make(content, message, Snackbar.LENGTH_LONG)
.setAction(actionText, onClick)
.setActionTextColor(actionTextColor)
.show();
}
public static void snackWithCustomTiming(View content, String message, int duration){
final Snackbar snackbar = Snackbar.make(content, message, Snackbar.LENGTH_INDEFINITE);
snackbar.show();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
snackbar.dismiss();
}
},duration);
}
}
para usar de esta manera:
//your duration
int duration = 4000
SnackBarMaker.snackWithCustomTiming(getActivity().findViewById(android.R.id.content)
, getString(R.string.your_message), duration);
Hola, pruebe esta biblioteca externa https://github.com/nispok/snackbar . Está en desuso, pero resolverá fácilmente su problema. Además es fácil de implementar. Antes de la biblioteca de soporte, yo estaba usando esta biblioteca solo para snackbars. Debido al problema de duración de la biblioteca de soporte, me complace utilizar esta biblioteca únicamente.
Parece estar arreglado en
compile ''com.android.support:design:22.2.1''
Solo Lint lo muestra en rojo subrayado, pero funciona.