Cómo crear y mostrar un mensaje emergente

Puedes usar un Snackbar para mostrar un mensaje breve al usuario. El mensaje desaparece automáticamente después de poco tiempo. Un Snackbar es ideal para mensajes breves en los que no es necesario que actúe el usuario. Por ejemplo, una app de correo electrónico podría usar un Snackbar para indicarle al usuario que la app envió correctamente un correo electrónico.

Cómo usar un objeto CoordinatorLayout

Un Snackbar se adjunta a una vista. Snackbar proporciona una funcionalidad básica si se adjunta a cualquier objeto derivado de la clase View, como cualquiera de los objetos de diseño comunes. Sin embargo, si el Snackbar está unido a un CoordinatorLayout, el Snackbar obtiene funciones adicionales:

  • El usuario puede descartar el Snackbar deslizándolo hacia afuera.
  • El diseño mueve otros elementos de la IU cuando aparece el Snackbar. Por ejemplo, si el diseño tiene un FloatingActionButton, el botón se mueve hacia arriba cuando muestra un Snackbar, en lugar de dibujar el Snackbar sobre el botón. Esto se muestra en la figura 1.

La clase CoordinatorLayout proporciona un superconjunto de la funcionalidad de FrameLayout. Si tu app ya usa un FrameLayout, puedes reemplazar ese diseño por un CoordinatorLayout para habilitar la funcionalidad completa de Snackbar. Si tu app usa otros objetos de diseño, lo más sencillo es unir los elementos de diseño existentes en un CoordinatorLayout, como en este ejemplo:

<android.support.design.widget.CoordinatorLayout
        android:id="@+id/myCoordinatorLayout"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- Here are the existing layout elements, now wrapped in
             a CoordinatorLayout -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <!-- …Toolbar, other layouts, other elements… -->

        </LinearLayout>

    </android.support.design.widget.CoordinatorLayout>

Asegúrate de establecer una etiqueta android:id para el CoordinatorLayout. Necesitas el ID del diseño cuando muestras el mensaje.

Figura 1: El CoordinatorLayout mueve el FloatingActionButton hacia arriba cuando aparece el Snackbar.

Cómo mostrar un mensaje

Hay dos pasos para mostrar un mensaje. Primero, creas un objeto Snackbar con el texto del mensaje. Luego, llamas al método show() de ese objeto para mostrar el mensaje al usuario.

Cómo crear un objeto Snackbar

Crea un objeto Snackbar mediante una llamada al método Snackbar.make() estático. Cuando creas el Snackbar, debes especificar el mensaje que se muestra y la duración:

Kotlin

    val mySnackbar = Snackbar.make(view, stringId, duration)
    

Java

    Snackbar mySnackbar = Snackbar.make(view, stringId, duration);
    
view
Es la vista a la que se adjunta el Snackbar. El método efectivamente busca la jerarquía de vistas desde la vista aprobada hasta llegar a un CoordinatorLayout o a la vista de contenido de la decoración de la ventana. Por lo general, es más sencillo pasar el CoordinatorLayout que incluye tu contenido.
stringId
Es el ID de recurso del mensaje que deseas mostrar. Puede ser texto con formato o sin formato.
duration
Es la cantidad de tiempo que se muestra el mensaje. Puede ser LENGTH_SHORT o LENGTH_LONG.

Cómo mostrar el mensaje al usuario

Una vez creado Snackbar, llama a su método show() para mostrar el Snackbar al usuario:

Kotlin

    mySnackbar.show()
    

Java

    mySnackbar.show();
    

El sistema no muestra varios objetos Snackbar al mismo tiempo, por lo que, si la vista muestra otro Snackbar, el sistema pone tu Snackbar en cola y lo muestra después de que venza o se descarte el Snackbar vigente.

Si solo quieres mostrar un mensaje al usuario y no necesitas llamar a ninguno de los métodos de utilidad del objeto Snackbar, no es necesario que mantegas la referencia al Snackbar después de llamar a show(). Por este motivo, se suele usar el método de encadenamiento para crear y mostrar un Snackbar en una declaración:

Kotlin

    Snackbar.make(
            findViewById(R.id.myCoordinatorLayout),
            R.string.email_sent,
            Snackbar.LENGTH_SHORT
    ).show()
    

Java

    Snackbar.make(findViewById(R.id.myCoordinatorLayout), R.string.email_sent,
                            Snackbar.LENGTH_SHORT)
            .show();