Aktionsansichten und Aktionsanbieter verwenden

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

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

  • Eine Aktionsansicht ist eine Aktion, die in der App-Leiste umfangreiche Funktionen bietet. In einer Suchaktionsansicht kann der Nutzer beispielsweise seinen Suchtext in die App-Leiste eingeben, ohne die Aktivität oder das Fragment zu wechseln.
  • Ein Aktionsanbieter ist eine Aktion mit einem eigenen benutzerdefinierten Layout. Die Aktion wird zuerst als Schaltfläche oder Menüelement angezeigt. Wenn der Nutzer auf die Aktion tippt, steuert der Aktionsanbieter das Verhalten der Aktion so, wie Sie es definieren. Der Aktionsanbieter könnte 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 zum Teilen von Informationen mit anderen Apps. Sie können auch eigene Aktionsansichten und Aktionsanbieter definieren.

Aktionsansicht hinzufügen

Wenn Sie eine Aktionsansicht 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 Attribut showAsAction 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 in der App 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 und füllt die App-Leiste aus.

Mit dem folgenden Code wird beispielsweise ein SearchView-Widget zur App-Leiste 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, wird es in der App als das durch android:icon angegebene Symbol angezeigt. Wenn in der App-Leiste kein Platz ist, fügt die App die Aktion dem Überlaufmenü hinzu.

Ein Bild mit einer Suchleiste mit einem Symbol am Anfang und am Ende.
Abbildung 1. Suchleiste mit Symbolen am Anfang und Ende.

Wenn der Nutzer auf das Symbol oder das Menüelement tippt, wird das Widget maximiert und füllt die Symbolleiste aus. Der Nutzer kann dann damit interagieren.

Ein Bild, auf dem eine Suchansicht zu sehen ist, die geöffnet wird, sobald die Suchleiste fokussiert ist.
Abbildung 2. Die Suchansicht wird geöffnet, sobald die Suchleiste fokussiert ist.

Wenn Sie die Aktion konfigurieren müssen, tun Sie dies im onCreateOptionsMenu()-Callback Ihrer Aktivität. Sie können die Objektreferenz der Aktionsansicht abrufen, indem Sie die Methode getActionView() aufrufen. Mit dem 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 das Aufklappen der Aktionsansicht reagieren

Wenn das <item>-Element der Aktion das Flag collapseActionView hat, wird die Aktionsansicht in der App als Symbol angezeigt, bis der Nutzer mit der Aktionsansicht interagiert. Wenn der Nutzer auf das Symbol tippt, wird die Aktionsansicht durch den integrierten Handler für onOptionsItemSelected() maximiert. Wenn Ihre abgeleitete Klasse die Methode onOptionsItemSelected() überschreibt, muss Ihre Überschreibungsmethode super.onOptionsItemSelected() aufrufen, damit die Basisklasse die Aktionsansicht maximieren kann.

Wenn Sie etwas ausführen 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. Sie können die Aktivität beispielsweise 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

Um einen Aktionsanbieter zu deklarieren, erstellen Sie ein <item>-Element in der Menüressource der Symbolleiste, wie unter Aktionen hinzufügen und verarbeiten beschrieben. Fügen Sie ein actionProviderClass-Attribut hinzu und legen Sie es auf den vollständig qualifizierten Klassennamen für die Aktionsanbieterklasse fest.

Mit dem folgenden Code wird beispielsweise ein ShareActionProvider deklariert. Das ist ein Widget, das in der AndroidX-Bibliothek definiert ist und 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 zu deklarieren, da ShareActionProvider eigene Grafiken bereitstellt. Wenn Sie eine benutzerdefinierte Aktion verwenden, deklarieren Sie ein Symbol.

Zusätzliche Ressourcen

  • Ein Beispiel für das Hinzufügen einer Freigabeaktion zur oberen App-Leiste finden Sie unter ShareActionProvider.
  • Weitere Informationen zum Erstellen eines benutzerdefinierten Aktionsanbieters finden Sie unter ActionProvider.