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

Wypróbuj Compose
Jetpack Compose to zalecany zestaw narzędzi do tworzenia interfejsu użytkownika na Androidzie. Dowiedz się, jak dodawać komponenty w Compose.

Biblioteka AndroidX udostępnia różne sposoby interakcji użytkowników z Twoją aplikacją. Toolbar W artykule Dodawanie działań i ich obsługa opisujemy, jak zdefiniować działanie, które może być przyciskiem lub elementem menu. Z tego dokumentu dowiesz się, jak dodać 2 wszechstronne 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 na pasku aplikacji bez konieczności zmiany aktywności lub fragmentów.
  • Dostawca działania to działanie z własnym, dostosowanym układem. Działanie początkowo pojawia się jako przycisk lub element menu. Gdy użytkownik kliknie działanie, dostawca działania kontroluje jego zachowanie w dowolny sposób. Na przykład dostawca działania może reagować na kliknięcie, wyświetlając menu.

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

Dodawanie widoku działania

Aby dodać widok działania, utwórz element <item> w zasobie menu paska narzędzi, jak opisano w artykule Dodawanie działań i ich obsługa. Do elementu <item> dodaj 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 wartość "ifRoom|collapseActionView" lub "never|collapseActionView". Flaga collapseActionView wskazuje, jak wyświetlać 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 rozszerzonym menu, aplikacja wyświetla go jako pozycja menu. Gdy użytkownik wejdzie w interakcję z widokiem działania, rozwinie się on, aby wypełnić 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 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ę, aby wypełnić pasek narzędzi, umożliwiając użytkownikowi interakcję z nim.

Obraz przedstawiający widok wyszukiwania, który otwiera się po zaznaczeniu paska wyszukiwania.
Rysunek 2. Widok wyszukiwania otwiera się po ustawieniu fokusu na pasku wyszukiwania.

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

Reagowanie na rozwinięcie widoku działania

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

Jeśli chcesz coś zrobić, gdy działanie jest rozwinięte lub zwinięte, możesz zdefiniować klasę, która implementuje MenuItem.OnActionExpandListener, i przekazać element tej klasy do setOnActionExpandListener(). Możesz na przykład zaktualizować aktywność na podstawie tego, czy widok działania jest rozwinięty czy zwinięty. Ten fragment kodu pokazuje, jak zdefiniować i przekazać odbiorcę:

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łania

Aby zadeklarować dostawcę działania, utwórz element <item> w zasobie menu paska narzędzi, jak opisano w artykule Dodawanie działań i ich obsługa. Dodaj atrybut actionProviderClass i ustaw go na w pełni kwalifikowaną nazwę klasy dostawcy działania.

Na przykład ten kod deklaruje ShareActionProvider, czyli widżet 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łasną grafikę. Jeśli używasz działania niestandardowego, zadeklaruj ikonę.

Dodatkowe materiały

  • Przykład dodawania działania udostępniania do górnego paska aplikacji znajdziesz w artykule ShareActionProvider.
  • Więcej informacji o tworzeniu niestandardowego dostawcy działania znajdziesz w artykule ActionProvider.