Utilizzare le visualizzazioni e i fornitori di azioni

La libreria AndroidX Toolbar fornisce modi diversi di interagire con la tua app da parte degli utenti. Aggiungere e gestire le azioni descrive come definisci un'azione, che può essere un pulsante o una voce di menu. Questo documento descrive come aggiungere due componenti versatili:

  • Una visualizzazione azioni è un'azione che offre funzionalità avanzate nella barra delle app. Per Ad esempio, la visualizzazione delle azioni di ricerca consente all'utente di digitare il testo di ricerca nella barra delle app senza dover di modificare attività o frammenti.
  • Un fornitore di azioni è un'azione con un layout personalizzato. L'azione inizialmente appare come pulsante o voce di menu; Quando l'utente tocca l'azione, il fornitore di azioni controlla il comportamento dell'azione in qualsiasi modo tu definisci. Ad esempio, il provider di azioni potrebbe rispondere a una tocca mostrando un menu.

AndroidX offre diversi widget specializzati di visualizzazione delle azioni e provider di azioni. Ad esempio, Widget SearchView implementa una visualizzazione delle azioni per l'inserimento delle query di ricerca. La ShareActionProvider Il widget implementa un fornitore di azioni per la condivisione di informazioni con altre app. Puoi inoltre definire le tue visualizzazioni di azioni e i tuoi fornitori di azioni.

Aggiungere una visualizzazione dell'azione

Per aggiungere una visualizzazione delle azioni, crea una <item> nella risorsa di menu della barra degli strumenti, come descritto in Aggiungere e gestire le azioni. Aggiungi uno dei seguenti attributi alla sezione <item> elemento:

  • actionViewClass: la classe di un widget che implementa l'azione
  • actionLayout: una risorsa di layout che descrive i componenti dell'azione

Imposta l'attributo showAsAction su "ifRoom|collapseActionView" oppure "never|collapseActionView". Il flag collapseActionView indica come mostrare il widget quando l'utente non interagisce. Se il widget si trova sulla barra delle app, visualizza il widget sotto forma di icona. Se il widget si trova nel menu extra, l'app lo visualizza. come voce di menu. Quando l'utente interagisce con la visualizzazione delle azioni, questa si espande fino a riempire la barra dell'app.

Ad esempio, il seguente codice aggiunge un widget SearchView alla barra delle app:

<item android:id="@+id/action_search"
     android:title="@string/action_search"
     android:icon="@drawable/ic_search"
     app:showAsAction="ifRoom|collapseActionView"
     app:actionViewClass="androidx.appcompat.widget.SearchView" />

Se l'utente non interagisce con il widget, l'app lo visualizza con l'icona specificata entro il giorno android:icon. Se non c'è spazio nella barra delle app, l'app aggiunge l'azione alla menu extra.

Un&#39;immagine che mostra una barra di ricerca con icone iniziali e finali.
. Figura 1. Barra di ricerca con icone all'inizio e alla fine.

Quando l'utente tocca l'icona o la voce di menu, il widget si espande fino a riempire la barra degli strumenti, consentendo l'interazione dell'utente con quest'ultima.

Un&#39;immagine che mostra una visualizzazione di ricerca aperta quando la barra di ricerca è nello stato attivo.
. Figura 2. La visualizzazione Ricerca si apre non appena la barra di ricerca è nello stato attivo.

Se devi configurare l'azione, fallo nella onCreateOptionsMenu() di Google. Puoi ottenere il riferimento all'oggetto della visualizzazione azione chiamando il metodo getActionView() . Ad esempio, il seguente codice ottiene il riferimento all'oggetto per SearchView widget definito nell'esempio di codice precedente:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_activity_actions, menu)

    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu)
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView =
            (SearchView) searchItem.getActionView();

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu);
}

Rispondere all'espansione della visualizzazione azione

Se l'elemento <item> dell'azione ha un flag collapseActionView, il valore l'app mostra la visualizzazione delle azioni sotto forma di icona finché l'utente non interagisce con quest'ultima. Quando l'utente tocca l'icona, il gestore integrato onOptionsItemSelected() espande la visualizzazione delle azioni. Se la sottoclasse dell'attività sostituisce la onOptionsItemSelected(), il metodo di override deve chiamare super.onOptionsItemSelected() in modo che la superclasse possa espandere la visualizzazione delle azioni.

Se vuoi eseguire un'azione quando l'azione è espansa o compressa, puoi definire una classe implements MenuItem.OnActionExpandListener, e passare un membro di quel corso setOnActionExpandListener(). Ad esempio, potresti voler aggiornare l'attività a seconda che la visualizzazione delle azioni sia espansa o meno compressi. Il seguente snippet di codice mostra come definire e passare un listener:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.options, menu)

    // Define the listener.
    val expandListener = object : MenuItem.OnActionExpandListener {
        override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
            // Do something when the action item collapses.
            return true // Return true to collapse the action view.
        }

        override fun onMenuItemActionExpand(item: MenuItem): Boolean {
            // Do something when it expands.
            return true // Return true to expand the action view.
        }
    }

    // Get the MenuItem for the action item.
    val actionMenuItem = menu?.findItem(R.id.myActionItem)

    // Assign the listener to that action item.
    actionMenuItem?.setOnActionExpandListener(expandListener)

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);

    // Define the listener.
    OnActionExpandListener expandListener = new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when the action item collapses.
            return true;  // Return true to collapse action view.
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when it expands.
            return true;  // Return true to expand the action view.
        }
    };

    // Get the MenuItem for the action item.
    MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

    // Assign the listener to that action item.
    MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true;
}

Aggiungi un fornitore di azioni

Per dichiarare un fornitore di azioni, crea un elemento <item> nel menu della barra degli strumenti risorsa, come descritto in Aggiungere e gestire azioni. Aggiungi un actionProviderClass e impostalo sul nome completo della classe per l'attributo della classe del provider di azioni.

Ad esempio, il seguente codice dichiara un ShareActionProvider, che è un widget definiti nella raccolta AndroidX che consente alla tua app di condividere dati con altre app:

<item android:id="@+id/action_share"
    android:title="@string/share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

In questo caso, non è necessario dichiarare un'icona per il widget, poiché ShareActionProvider fornisce la propria grafica. Se utilizzi un'azione personalizzata, dichiarare un'icona.

Risorse aggiuntive

  • Consulta ShareActionProvider per vedere un esempio di aggiunta di un'azione di condivisione alla barra delle app in alto.
  • Consulta ActionProvider per scopri di più sulla creazione di un provider di azioni personalizzate.