Korzystanie z widoków działań i dostawców działań

Wypróbuj tworzenie wiadomości
Jetpack Compose to zalecany zestaw narzędzi interfejsu na Androida. Dowiedz się, jak dodawać komponenty w sekcji Tworzenie.

Biblioteka AndroidXToolbar udostępnia różne sposoby interakcji użytkowników z aplikacją. W artykule Dodawanie i obsługa działań znajdziesz informacje o tym, jak zdefiniować działanie, które może być przyciskiem lub elementem menu. Z tego dokumentu dowiesz się, jak dodać 2 uniwersalne komponenty:

  • Widok działania to działanie, które zapewnia bogatą funkcjonalność na pasku aplikacji. Na przykład widok działania wyszukiwania umożliwia użytkownikowi wpisywanie tekstu wyszukiwania w pasku aplikacji bez konieczności zmiany działań lub fragmentów.
  • Dostawca działań to działanie o własnym niestandardowym układzie. Działanie jest początkowo wyświetlane jako przycisk lub element menu. Gdy użytkownik kliknie działanie, dostawca określa jego działanie w dowolny sposób. Na przykład dostawca czynności może wyświetlić menu po dotknięciu.

AndroidX udostępnia kilka wyspecjalizowanych widżetów widoku akcji i widżetów dostawców akcji. Na przykład widżet SearchView implementuje widok działania do wpisywania zapytań. ShareActionProvider Widget implementuje dostawcę działań do udostępniania informacji innym aplikacjom. Możesz też zdefiniować własne widoki działań i dostawców działań.

Dodawanie widoku czynności

Aby dodać widok działania, utwórz element <item> w zasobie menu paska narzędzi zgodnie z opisem w artykule Dodawanie działań i obsługa ich. Dodaj do elementu <item> jeden z tych atrybutów:

  • actionViewClass: klasa widżetu, który implementuje działanie
  • actionLayout: zasób układu opisujący komponenty działania

Ustaw atrybut showAsAction na "ifRoom|collapseActionView" lub "never|collapseActionView". Flaga collapseActionView wskazuje, jak wyświetlić widżet, gdy użytkownik nie wchodzi z nim w interakcję. Jeśli widżet znajduje się na pasku aplikacji, aplikacja wyświetla go jako ikonę. Jeśli widżet znajduje się w menu rozszerzonym, aplikacja wyświetla go jako pozycję menu. Gdy użytkownik wejdzie w interakcję z widokiem akcji, widok ten rozszerzy się, wypełniając pasek aplikacji.

Na przykład ten kod dodaje widżet SearchView do paska aplikacji:

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

Jeśli użytkownik nie wchodzi w interakcję z widżetem, aplikacja wyświetla go jako ikonę określoną przez android:icon. Jeśli na pasku aplikacji nie ma miejsca, aplikacja dodaje działanie do menu przepełnienia.

Obraz przedstawiający pasek wyszukiwania z ikonami na początku i na końcu.
Rysunek 1. Pasek wyszukiwania z ikonami na początku i na końcu

Gdy użytkownik kliknie ikonę lub element menu, widżet rozszerzy się, wypełniając pasek narzędzi, umożliwiając użytkownikowi interakcję z widżetem.

Obraz przedstawiający widok wyszukiwania po wybraniu paska wyszukiwania
Rysunek 2. Widok wyszukiwania otwiera się, gdy pasek wyszukiwania zostanie zaznaczony.

Jeśli musisz skonfigurować działanie, zrób to w funkcji wywołania onCreateOptionsMenu()w aktywności. Odwołania do obiektu widoku działania możesz uzyskać, wywołując metodę getActionView(). Na przykład ten kod pobiera odwołanie do obiektu widgeta SearchView zdefiniowanego w poprzednim przykładzie kodu:

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

Odpowiedź na rozwinięcie widoku z wezwaniem do działania

Jeśli element <item> działania ma flagę collapseActionView, aplikacja wyświetla widok działania jako ikonę, dopóki użytkownik nie wejdzie z nim w interakcję. Gdy użytkownik kliknie ikonę, wbudowany moduł obsługionOptionsItemSelected()rozwinie widok działania. Jeśli podklasa aktywności zastępuje metodę onOptionsItemSelected(), metoda zastępcza musi wywoływać metodę super.onOptionsItemSelected(), aby superklasa mogła rozwinąć widok działania.

Jeśli chcesz wykonać jakąś czynność, gdy działanie jest rozwinięte lub zwężone, możesz zdefiniować klasę, która implementujeMenuItem.OnActionExpandListener, i przekazać do niej element klasysetOnActionExpandListener(). Możesz na przykład zaktualizować aktywność w zależności od tego, czy widok akcji jest rozwinięty czy zwinięty. Ten fragment kodu pokazuje, jak zdefiniować i przekazać listenera:

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

Dodawanie dostawcy działań

Aby zadeklarować dostawcę działań, utwórz element <item> w menu zasobu na pasku narzędzi zgodnie z opisem w artykule Dodawanie działań i obsługa działań. Dodaj atrybut actionProviderClass i ustaw go na pełną nazwę klasy dostawcy działań.

Na przykład kod poniżej deklaruje ShareActionProvider, czyli widget zdefiniowany w bibliotece AndroidX, który umożliwia aplikacji udostępnianie danych innym aplikacjom:

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

W tym przypadku nie trzeba deklarować ikony widżetu, ponieważ ShareActionProvider udostępnia własne grafiki. Jeśli używasz działania niestandardowego, zadeklaruj ikonę.

Dodatkowe materiały

  • Przykład dodania funkcji udostępniania do górnego paska aplikacji znajdziesz na stronie ShareActionProvider.
  • Więcej informacji o tworzeniu niestandardowego dostawcy działań znajdziesz w artykule ActionProvider.