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

Toolbar w bibliotece AndroidX zapewnia użytkownikom różne sposoby korzystania z aplikacji. Dodawanie i obsługa działań opisuje, jak zdefiniować działanie, które może być przyciskiem lub pozycją menu. W tym dokumencie opisujemy, jak dodać 2 uniwersalne komponenty:

  • Widok działań to działanie z licznymi funkcjami na pasku aplikacji. Na przykład widok działań związanych z wyszukiwaniem pozwala użytkownikowi wpisać wyszukiwany tekst w pasku aplikacji bez konieczności zmiany aktywności lub fragmentów.
  • Dostawca działania to działanie z własnym niestandardowym układem. Czynność początkowo ma postać przycisku lub elementu menu. Gdy użytkownik kliknie działanie, jego dostawca określa sposób jego działania w dowolny sposób. Dostawca działań może na przykład zareagować na kliknięcie, wyświetlając menu.

AndroidX udostępnia kilka wyspecjalizowanych widoków działań i widżetów dostawców działań. Na przykład widżet SearchView implementuje widok działań służący do wpisywania wyszukiwanych haseł. Widżet ShareActionProvider implementuje dostawcę działań służący do udostępniania informacji innym aplikacjom. Możesz też zdefiniować własne widoki działań i ich dostawców.

Dodawanie widoku działania

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

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

Ustaw atrybut showAsAction na "ifRoom|collapseActionView" lub "never|collapseActionView". Flaga collapseActionView wskazuje sposób wyświetlania widżetu, gdy użytkownik nie wchodzi z nim w interakcję. Jeśli widżet znajduje się na pasku aplikacji, wyświetla go jako ikonę. Jeśli widżet jest w rozszerzonym menu, aplikacja wyświetla go jako pozycję menu. Gdy użytkownik wejdzie w interakcję z widokiem działań, rozwinie się on, 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 będzie miejsca, aplikacja doda działanie do rozszerzonego menu.

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 rozwinie się, wypełniając pasek narzędzi, umożliwiając użytkownikowi interakcję z nim.

Obraz przedstawiający otwarty widok wyszukiwania po zaznaczeniu paska wyszukiwania.
Rysunek 2. Widok wyszukiwania jest otwierany po zaznaczeniu paska wyszukiwania.

Jeśli musisz skonfigurować działanie, zrób to w wywołaniu zwrotnym onCreateOptionsMenu() aktywności. Odniesienie do obiektu widoku działania możesz uzyskać, wywołując metodę getActionView(). Na przykład ten kod pobiera odwołanie do obiektu dla widżetu 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);
}

Reakcja na rozwinięcie widoku działania

Jeśli element <item> akcji 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ę, wbudowana moduł obsługi onOptionsItemSelected() rozwinie widok działania. Jeśli podklasa aktywności zastępuje metodę onOptionsItemSelected(), metoda zastępowania musi wywołać metodę super.onOptionsItemSelected(), aby klasa nadrzędna mogła rozwinąć widok działania.

Jeśli chcesz coś zrobić, gdy akcja jest rozwinięta lub zwinięta, możesz zdefiniować klasę implementującą MenuItem.OnActionExpandListener i przekazać jej członka do setOnActionExpandListener(). Możesz na przykład aktualizować aktywność w zależności od tego, czy widok działania jest rozwinięty czy zwinięty. Ten fragment kodu pokazuje, jak zdefiniować i przekazać detektor:

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

Dodaj dostawcę działań

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

Na przykład ten kod deklaruje ShareActionProvider, czyli widżet zdefiniowany w bibliotece AndroidX, który umożliwia 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 takim przypadku nie ma potrzeby deklarowania ikony widżetu, bo ShareActionProvider udostępnia własną grafikę. Jeśli korzystasz z działania niestandardowego, zadeklaruj ikonę.

Dodatkowe materiały

  • Przykład dodania działania udostępniania do górnego paska aplikacji znajdziesz w sekcji ShareActionProvider.
  • Więcej informacji o tworzeniu dostawcy działań niestandardowych znajdziesz w sekcji ActionProvider.