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
.