Aktionsansichten und Aktionsanbieter verwenden

Compose ausprobieren
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Weitere Informationen zum Hinzufügen von Komponenten in Compose

Die Toolbar der AndroidX-Bibliothek bietet Nutzern verschiedene Möglichkeiten, mit Ihrer App zu interagieren. Im Hilfeartikel Aktionen hinzufügen und verarbeiten wird beschrieben, wie Sie eine Aktion definieren, die eine Schaltfläche oder ein Menüpunkt sein kann. In diesem Dokument wird beschrieben, wie Sie zwei vielseitige Komponenten hinzufügen:

  • Eine Aktionsansicht ist eine Aktion, die umfangreiche Funktionen in der App-Leiste bietet. Mit einer Suchansicht können Nutzer beispielsweise ihren Suchtext in die App-Leiste eingeben, ohne Aktivitäten oder Fragmente ändern zu müssen.
  • Ein Aktionsanbieter ist eine Aktion mit einem eigenen benutzerdefinierten Layout. Die Aktion wird zuerst als Schaltfläche oder Menüpunkt angezeigt. Wenn der Nutzer auf die Aktion tippt, steuert der Aktionsanbieter das Verhalten der Aktion wie von Ihnen definiert. So kann der Aktionsanbieter beispielsweise auf ein Tippen reagieren, indem er ein Menü anzeigt.

AndroidX bietet mehrere spezielle Widgets für Aktionsansichten und Aktionsanbieter. Das SearchView-Widget implementiert beispielsweise eine Aktionsansicht zum Eingeben von Suchanfragen. Das ShareActionProvider-Widget implementiert einen Aktionsanbieter, um Informationen für andere Apps freizugeben. Sie können auch eigene Aktionsansichten und Aktionsanbieter definieren.

Aktionsansicht hinzufügen

Wenn Sie eine Aktionsanzeige hinzufügen möchten, erstellen Sie ein <item>-Element in der Menüressource der Symbolleiste, wie unter Aktionen hinzufügen und verarbeiten beschrieben. Fügen Sie dem <item>-Element eines der folgenden Attribute hinzu:

  • actionViewClass: Die Klasse eines Widgets, das die Aktion implementiert
  • actionLayout: eine Layoutressource, die die Komponenten der Aktion beschreibt

Legen Sie das showAsAction-Attribut auf "ifRoom|collapseActionView" oder "never|collapseActionView" fest. Das Flag collapseActionView gibt an, wie das Widget angezeigt werden soll, wenn der Nutzer nicht damit interagiert. Wenn sich das Widget in der App-Leiste befindet, wird es als Symbol angezeigt. Wenn sich das Widget im Dreipunkt-Menü befindet, wird es in der App als Menüpunkt angezeigt. Wenn der Nutzer mit der Aktionsansicht interagiert, wird sie maximiert, um die App-Leiste zu füllen.

Mit dem folgenden Code wird beispielsweise der App-Leiste ein SearchView-Widget hinzugefügt:

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

Wenn der Nutzer nicht mit dem Widget interagiert, zeigt die App das Widget als das von android:icon angegebene Symbol an. Wenn in der App-Leiste kein Platz ist, fügt die App die Aktion dem Überlaufmenü hinzu.

Ein Bild mit einer Suchleiste mit einem Vor- und einem Nachzeichen.
Abbildung 1. Suchleiste mit Symbolen am Anfang und Ende

Wenn der Nutzer auf das Symbol oder den Menüpunkt tippt, wird das Widget maximiert, um die Symbolleiste zu füllen, sodass der Nutzer damit interagieren kann.

Ein Bild, das eine Suchansicht zeigt, die geöffnet wird, sobald die Suchleiste den Fokus erhält.
Abbildung 2. Die Suchansicht wird geöffnet, sobald die Suchleiste den Fokus erhält.

Wenn Sie die Aktion konfigurieren müssen, tun Sie dies im onCreateOptionsMenu()-Callback Ihrer Aktivität. Sie können die Objektreferenz der Aktionsanzeige abrufen, indem Sie die Methode getActionView() aufrufen. Im folgenden Code wird beispielsweise die Objektreferenz für das im vorherigen Codebeispiel definierte SearchView-Widget abgerufen:

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

Auf die Erweiterung der Aktionsansicht reagieren

Wenn das <item>-Element der Aktion das Flag collapseActionView hat, zeigt die App die Aktionsanzeige als Symbol an, bis der Nutzer mit der Aktionsanzeige interagiert. Wenn der Nutzer auf das Symbol tippt, maximiert der integrierte Handler für onOptionsItemSelected() die Aktionsansicht. Wenn die Unterklasse der Aktivität die Methode onOptionsItemSelected() überschreibt, muss die überschreibende Methode super.onOptionsItemSelected() aufrufen, damit die übergeordnete Klasse die Aktionsansicht maximieren kann.

Wenn Sie etwas tun möchten, wenn die Aktion maximiert oder minimiert wird, können Sie eine Klasse definieren, die MenuItem.OnActionExpandListener implementiert, und ein Mitglied dieser Klasse an setOnActionExpandListener() übergeben. So können Sie beispielsweise die Aktivität aktualisieren, je nachdem, ob eine Aktionsansicht maximiert oder minimiert ist. Das folgende Code-Snippet zeigt, wie ein Listener definiert und übergeben wird:

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

Aktionsanbieter hinzufügen

Wenn Sie einen Aktionsanbieter deklarieren möchten, erstellen Sie ein <item>-Element in der Menüressource der Symbolleiste, wie unter Aktionen hinzufügen und verarbeiten beschrieben. Fügen Sie das Attribut actionProviderClass hinzu und legen Sie es auf den voll qualifizierten Klassennamen der Aktionsanbieterklasse fest.

Im folgenden Code wird beispielsweise ein ShareActionProvider deklariert. Das ist ein in der AndroidX-Bibliothek definiertes Widget, mit dem Ihre App Daten mit anderen Apps teilen kann:

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

In diesem Fall ist es nicht erforderlich, ein Symbol für das Widget anzugeben, da ShareActionProvider eigene Grafiken bereitstellt. Wenn Sie eine benutzerdefinierte Aktion verwenden, deklarieren Sie ein Symbol.

Weitere Informationen

  • Unter ShareActionProvider finden Sie ein Beispiel dafür, wie Sie der App-Leiste oben eine Freigabeaktion hinzufügen.
  • Weitere Informationen zum Erstellen eines benutzerdefinierten Aktionsanbieters finden Sie unter ActionProvider.