Snack bar

Según la documentación de Google sobre Material Design.

Los snackbars provee un feedback suave sobre una operación que muestra un breve mensaje en la parte baja de la pantalla. Los snackbars pueden contener una acción.

¿Cómo se añade?

I. En tu archivo build.gradle añade la última versión de la librería de diseño, design.

dependencies {  
    compile 'com.android.support:design:X.X.X' 
    // X.X.X especifica la versión
}

II. Crea una instancia de Snackbar con el método make(), posteriormente llama al método show().

Snackbar  
    .make(view, "No network connection.",Snackbar.LENGTH_SHORT)
    .show();

El parámetro view es usado para localizar al elemento padre. El snackbar se mostrará sobre él.

Duración

Para especificar cuanto tiempo será visible el Snackbar utiliza el método setDuration.

// Constantes pre-definidas
Snackbar.LENGTH_SHORT // 1500 millis  
Snackbar.LENGTH_LONG // 2750 millis  
Snackbar.LENGTH_INDEFINITE

// Duración personalizada
snackbar.setDuration(TimeUnit.MINUTES.toMillis(1));  

Dismiss

Para ocultar el snackbar manualmente en cualquier momento utiliza el método dismiss().

Snackbar snackBar = Snackbar.make(view, text, duration);  
snackBar.dismiss(); // Oculta el snackbar  

Eventos

Para estar al tanto cuando un snackbar se muestra o se oculta utiliza el método setCallback.

Snackbar  
  .make(...)
  .setCallback(new Snackbar.Callback() {
    @Override
    public void onDismissed(Snackbar snackbar, int event) {
      // Tu acción de dismiss aquí
    }
    @Override
    public void onShown(Snackbar snackbar) {
      // Tu acción para cuando se muestre el snackbar aquí
    }
  })

El parámetro event de onDismissed() es una de las constantes predefinidas en Snackbar.Callback.

Acciones

Un snackbar puede contener una acción. Para añadirla utiliza el método setAction().

Snackbar  
 .make(...)
 .setAction("Retry", new View.OnClickListener() {
             @Override
             public void onClick(View v) {
               // Tu acción aquí
             }
           })

Para permitir swipe-to-dismis y automáticamente mover widgets como FloatingActionButton utiliza el CoordinatorLayout como tu layout raíz.

<android.support.design.widget.CoordinatorLayout  
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.design.widget.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end|bottom"
            android:src="@android:drawable/ic_menu_call"/>
</android.support.design.widget.CoordinatorLayout>  

¿Cómo se estiliza?

Con un tema

I. Declara tu estilo personalizado en tu archivo de estilos style.xml.

<style name="SnackbarTheme" parent="Theme.AppCompat.Light">  
    <item name="colorAccent">@color/indigo</item>
    <item name="android:textColor">@color/pink</item>
</style>  

II. Aplica este estilo a tu activity con el atributo android:theme en tu archivo AndroidManifest.xml.

<activity  
    android:name=".SnackbarActivity"
    android:theme="@style/AppTheme">
</activity>  

Nota: Aplicar el atributo theme al elemento activity implicará que todas sus vistas utilizen su colorAccent y android:textColor.

Con código

Obtener la vista del Snackbar usando el método getView() y cambiar sus propiedades.

// Crea una instancia
Snackbar snackbar = Snackbar.make(view, text, duration);

// Configura el color del botón de acción
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));

// Obtén la vista del snackbar
View snackbarView = snackbar.getView();

// Cambia el color del snackbar
int snackbarTextId = android.support.design.R.id.snackbar_text;  
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);  
textView.setTextColor(getResources().getColor(R.color.indigo));

// Cambia el fondo del snackbar
snackbarView.setBackgroundColor(Color.MAGENTA);  

Escrito orginialmente por Yakiv Mospan en MaterialDoc