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łanieactionLayout: 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.
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.
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.