Aggiungi e gestisci azioni

La barra dell'app ti consente di aggiungere pulsanti per le azioni degli utenti. Questa funzionalità ti consente di inserire le azioni più importanti per il contesto corrente nella parte superiore dell'app. Ad esempio, un'app di navigazione di foto potrebbe mostrare i pulsanti Condividi e Crea album in alto quando l'utente sta visualizzando il suo rullino fotografico. Quando l'utente guarda una singola foto, nell'app potrebbero essere visualizzati i pulsanti Ritaglia e Filtra.

Lo spazio nella barra dell'app è limitato. Se un'app dichiara un numero di azioni superiore a quello consentito nella barra dell'app, quest'ultima invia le azioni in eccesso a un menu overflow. L'app può anche specificare che un'azione venga sempre visualizzata nel menu extra, anziché nella barra dell'app.

Immagine che mostra Now nell'app per Android con l'icona di una barra delle azioni
Figura 1. Un'icona di azione nell'app "Ora su Android".

Aggiungi pulsanti di azione

Tutti i pulsanti di azione e gli altri elementi disponibili nell'overflow di azioni sono definiti in una risorsa di menu XML. Per aggiungere azioni alla barra delle azioni, crea un nuovo file XML nella directory res/menu/ del tuo progetto.

Aggiungi un elemento <item> per ogni elemento che vuoi includere nella barra delle azioni, come mostrato nel seguente file XML del menu di esempio:

<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>

L'attributo app:showAsAction specifica se l'azione viene mostrata come un pulsante nella barra dell'app. Se imposti app:showAsAction="ifRoom", come nell'azione preferita del codice di esempio, l'azione viene visualizzata sotto forma di pulsante se nella barra dell'app c'è spazio. Se lo spazio non è sufficiente, le azioni in eccesso vengono inviate al menu extra. Se imposti app:showAsAction="never", come nell'azione settings del codice di esempio, l'azione viene sempre elencata nel menu extra e non viene visualizzata nella barra dell'app.

Il sistema utilizza l'icona dell'azione come pulsante di azione se l'azione viene visualizzata nella barra dell'app. Puoi trovare molte icone utili nella sezione Icone materiali.

Rispondere alle azioni

Quando l'utente seleziona uno degli elementi della barra dell'app, il sistema chiama il metodo di callback onOptionsItemSelected() dell'attività e passa un oggetto MenuItem per indicare quale elemento è stato toccato. Nell'implementazione di onOptionsItemSelected(), chiama il metodo MenuItem.getItemId() per determinare quale elemento è stato toccato. L'ID restituito corrisponde al valore dichiarato nell'attributo android:id dell'elemento <item> corrispondente.

Ad esempio, lo snippet di codice riportato di seguito controlla l'azione selezionata dall'utente. Se il metodo non riconosce l'azione dell'utente, richiama il metodo superclasse:

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

    }
}