Cómo usar el método setDuration() en SnackBar (Biblioteca de soporte de diseño de Android)

5 minutos de lectura

avatar de usuario
tecnología

De la documentación: duración del parámetro: puede ser 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 lugar de 8 segundos, Snackbar se fue rápidamente.

  • ¿Qué significa “No puedo establecer una duración personalizada”? ¿Cuáles son sus síntomas específicos?

    – CommonsWare

    30 de mayo de 2015 a las 20:08

  • @CommonsWare Lo que quiere decir es que no puede establecer una duración personalizada. Solo toma Longitud.Larga y Longitud.Corta. Salida “Debe ser uno de: Snackbar.LENGTH_SHORT, Snackbar.LENGTH_LONG” La documentación establece que es posible establecer una duración personalizada en milisegundos. Creo que es un error en la biblioteca y probablemente se solucionará. Probé muchos métodos diferentes pero no pude encontrar la solución. Si puede tener un truco y encontrar y responder, publíquelo. desarrollador.android.com/reference/android/support/design/widget/…

    – Eugenio H.

    31 de mayo de 2015 a las 0:18

  • @EugeneH: Tienes razón; es un error Vea mi respuesta a continuación.

    – CommonsWare

    31 de mayo de 2015 a las 0:27

  • Tengo este problema también. Uso LENGTH_LONG pero el problema no se resuelve y el snackbar se descarta en el tercer segundo…

    –Hamidreza Hosseinkhani

    6 de junio de 2015 a las 11:25

  • Usa este enlace.. technotalkative.com/part-2-welcome-snackbar-goodbye-toast Es una demostración completa del fundador de @pareshMayani GDG

    – Zala Janaksinh

    2 de julio de 2015 a las 7:23


avatar de usuario
CommonsWare

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

Entonces, cualquier valor que no sea LENGTH_LONG da como resultado un snackbar de corta duración.

he presentado un problema sobre eso

Editar: Se ha corregido en la revisión 22.2.1. Consulte las notas de la versión aquí

Los documentos de Android tienen NO se ha actualizado todavía, pero si salta al código fuente, notará que el parámetro para el método setDuration (duración int) puede ser LENGTH_SHORT, LENGTH_LONG, LONGITUD_INDEFINIDA o una duración personalizada en milisegundos

  • @ScottW: “¿dónde encontraste ese código fuente?” — … y saqué la espada de la piedra, y la Dama del Lago entonó “lo siento, pero todo el asunto del Rey de los Británicos fue un trato de una sola vez; ¿puedo interesarte en algún código fuente de MNC en su lugar?” ?”. O, posiblemente, descargué la fuente a través del SDK Manager. Cree lo que quieras. 🙂 “Me encantaría saber los valores de LONG_DURATION_MS y SHORT_DURATION_MS” — 1500 y 2750, respectivamente.

    – CommonsWare

    25 de junio de 2015 a las 14:49

  • @ScottW: “los lugares que he buscado (AOSP, fuente en el administrador de descargas) no parecen tener clases de Snackbar ni de SnackbarManager”. — en mi máquina, está en $ANDROID_SDK/sources/android-MNC/android/support/design/widget/SnackbarManager.java.

    – CommonsWare

    25/06/2015 a las 14:50


  • @ScottW: ¡Me alegro de que lo hayas encontrado, y estoy igualmente contento de que creas en los mitos artúricos! Sin embargo, una nota rápida para cualquiera que se tope con esto en el futuro: invertí los dos números en mi comentario. La duración larga es 2750 y la duración corta es 1500.

    – CommonsWare

    25 de junio de 2015 a las 15:32

  • Parece que este problema se solucionó en M con la versión preliminar 2, pero la solución aún no se ha publicado en la biblioteca de soporte de diseño.

    – John Cummings

    14/07/2015 a las 20:03


  • En 22.2.1 es posible establecer una duración personalizada, pero tuve que deshabilitar la inspección de pelusa para el método setDuration porque estaba dando un error (la inspección aún no se ha actualizado correctamente).

    – jmart

    11 de agosto de 2015 a las 10:06

avatar de usuario
jimmy kamau

Establezca la duración inicial en LENGTH_INDEFINITE y luego establezca 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();

  • Si usamos 8000, Android compila. Pero no compila, si establecemos una constante (DURACIÓN = 8000). Escribe @SuppressLint("WrongConstant") para esta situación.

    – CoolMind

    13 de noviembre de 2019 a las 17:24

Ya que 'com.android.support:design:22.2.1'

puedes establecer la duración de tu Snackbar en LENGTH_INDEFINITEhará que se muestre el Snackbar hasta que se descarte o se muestre otro snackbar.

avatar de usuario
kundan roy

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();

avatar de usuario
jackson

Parece estar fijo en

compile 'com.android.support:design:22.2.1'

Solo Lint lo muestra subrayado en rojo, pero funciona.

  • Sí, para mí también. Eso es raro. Estoy usando v23.1.1

    – camelloCaseCoder

    11 de marzo de 2016 a las 9:14

  • agregar //noinspection WrongConstant para callar a Lint y debería funcionar bien

    – Espen Riskedal

    24 de enero de 2017 a las 10:09

avatar de usuario
ziv kesten

Creé una solución para esto, hice una Clase que establece snackbars con una duración personalizada usando el controlador 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 así:

  //your duration
   int duration = 4000 
SnackBarMaker.snackWithCustomTiming(getActivity().findViewById(android.R.id.content)
                                               , getString(R.string.your_message), duration);

  • Sí, para mí también. Eso es raro. Estoy usando v23.1.1

    – camelloCaseCoder

    11 de marzo de 2016 a las 9:14

  • agregar //noinspection WrongConstant para callar a Lint y debería funcionar bien

    – Espen Riskedal

    24 de enero de 2017 a las 10:09

avatar de usuario
akshat

Hola, prueba 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, estaba usando esta biblioteca solo para snackbars. Debido al problema de duración de la biblioteca de soporte, estoy feliz de usar solo esta biblioteca.

¿Ha sido útil esta solución?