Cómo agregar y controlar 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 para el contexto actual en la parte superior de la app. Por ejemplo, una app de búsqueda de fotos puede mostrar los botones para compartir y crear álbumes en la parte superior cuando el usuario mira su rollo de fotos, y, cuando el usuario mira una foto individual, la app puede mostrar botones de recorte y filtro.

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 debe mostrar una acción en el Menú ampliado, en lugar de mostrarse en la barra de la app.

Figura 1: Barra de la app con un solo botón de acción y un Menú ampliado

Cómo agregar botones de acción

Todos los botones de acción y demás 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 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 este ejemplo de código de un archivo XML de menú:

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

        <!-- "Mark Favorite", should 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, should 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 se debe mostrar la acción 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), se muestra la acción 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, no en la barra de la app.

El sistema utiliza el ícono de la acción como botón de acción si esta se muestra en la barra de la app. Puedes buscar muchos íconos útiles en la página de Í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 en qué elemento se hizo clic. En tu implementación de onOptionsItemSelected(), llama al método MenuItem.getItemId() a fin de determinar qué elemento se presionó. El ID que se muestra coincide con el valor declarado en el atributo <item> del elemento android:id correspondiente.

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

Kotlin

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

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

        else -> {
            // If we got here, the user's action was not 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 chose the "Settings" item, show the app settings UI...
                return true;

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

            default:
                // If we got here, the user's action was not recognized.
                // Invoke the superclass to handle it.
                return super.onOptionsItemSelected(item);

        }
    }