Cómo agregar y administrar acciones

La barra de la app te permite agregar botones para las acciones del usuario. Esta función te permite colocar las acciones más importantes del contexto actual en la parte superior de la app. Por ejemplo, una app de navegación de fotos podría mostrar los botones para compartir y crear álbum en la parte superior cuando el usuario mira su rollo de fotos. Cuando el usuario mira una foto individual, la app puede mostrar los botones recortar y filtrar.

El espacio en la barra de la app es limitado. Si una app declara más acciones de las que pueden caber en la barra de la app, esta envía las acciones sobrantes a un Menú ampliado. La app también puede especificar que siempre se muestre una acción en el menú ampliado, en lugar de mostrarse en la barra de la app.

Una imagen que muestra la app de Now in Android con un ícono de barra de acciones
Figura 1: Un ícono de acción en la app de "Now in Android"

Cómo agregar botones de acción

Todos los botones de acción y otros elementos disponibles en el menú ampliado de acciones se definen en un recurso de menú XML. Para agregar acciones a la barra de acciones, crea un nuevo archivo en formato XML en el directorio res/menu/ de tu proyecto.

Agrega un elemento <item> por cada elemento que desees incluir en la barra de acciones, como se muestra en el siguiente archivo en formato XML del menú de ejemplo:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- "Mark Favorite", must appear as action button if possible. -->
    <item
        android:id="@+id/action_favorite"
        android:icon="@drawable/ic_favorite_black_48dp"
        android:title="@string/action_favorite"
        app:showAsAction="ifRoom"/>

    <!-- Settings, must always be in the overflow. -->
    <item android:id="@+id/action_settings"
          android:title="@string/action_settings"
          app:showAsAction="never"/>

</menu>

El atributo app:showAsAction especifica si la acción se muestra como un botón en la barra de la app. Si configuras app:showAsAction="ifRoom", como en la acción favorita del código de ejemplo, la acción se muestra como un botón si hay espacio en la barra de la app. Si no hay suficiente espacio, las acciones excedentes se envían al menú ampliado. Si configuras app:showAsAction="never", como en la acción de configuración del código de ejemplo, la acción siempre aparecerá en el menú ampliado y no en la barra de la app.

El sistema usa el ícono de la acción como botón de acción si esta se muestra en la barra de la app. Puedes encontrar muchos íconos útiles en Íconos de material.

Cómo responder a acciones

Cuando el usuario selecciona uno de los elementos de la barra de la app, el sistema llama al método de devolución de llamada onOptionsItemSelected() de tu actividad y pasa un objeto MenuItem para indicar qué elemento se presionó. En tu implementación de onOptionsItemSelected(), llama al método MenuItem.getItemId() para determinar qué elemento se presionó. El ID que se muestra coincide con el valor que declaras en el atributo android:id del elemento <item> correspondiente.

Por ejemplo, el siguiente fragmento de código verifica qué acción selecciona el usuario. Si el método no reconoce la acción del usuario, invoca el método de la superclase:

Kotlin

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
    R.id.action_settings -> {
        // User chooses the "Settings" item. Show the app settings UI.
        true
    }

    R.id.action_favorite -> {
        // User chooses the "Favorite" action. Mark the current item as a
        // favorite.
        true
    }

    else -> {
        // The user's action isn't recognized.
        // Invoke the superclass to handle it.
        super.onOptionsItemSelected(item)
    }
}

Java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            // User chooses the "Settings" item. Show the app settings UI.
            return true;

        case R.id.action_favorite:
            // User chooses the "Favorite" action. Mark the current item as a
            // favorite.
            return true;

        default:
            // The user's action isn't recognized.
            // Invoke the superclass to handle it.
            return super.onOptionsItemSelected(item);

    }
}