Toolbar
библиотеки AndroidX предоставляет пользователям различные способы взаимодействия с вашим приложением. Добавление и обработка действий описывает, как определить действие , которое может быть кнопкой или пунктом меню. В этом документе описывается, как добавить два универсальных компонента:
- Представление действий — это действие, предоставляющее богатые функциональные возможности на панели приложения. Например, представление действия поиска позволяет пользователю вводить текст поиска на панели приложения без необходимости изменять действия или фрагменты.
- Поставщик действий — это действие со своим собственным настраиваемым макетом. Первоначально действие отображается как кнопка или пункт меню; когда пользователь касается действия, поставщик действия управляет поведением действия любым способом, который вы определяете. Например, поставщик действий может реагировать на нажатие, отображая меню.
AndroidX предоставляет несколько специализированных виджетов представления действий и поставщиков действий. Например, виджет SearchView
реализует представление действий для ввода поисковых запросов. Виджет ShareActionProvider
реализует поставщик действий для обмена информацией с другими приложениями. Вы также можете определить свои собственные представления действий и поставщиков действий.
Добавить представление действий
Чтобы добавить представление действий, создайте элемент <item>
в ресурсе меню панели инструментов, как описано в разделе Добавление и обработка действий . Добавьте к элементу <item>
один из следующих атрибутов:
-
actionViewClass
: класс виджета, реализующего действие. -
actionLayout
: ресурс макета, описывающий компоненты действия.
Установите для атрибута showAsAction
значение "ifRoom|collapseActionView"
или "never|collapseActionView"
. Флаг collapseActionView
указывает, как отображать виджет, когда пользователь с ним не взаимодействует. Если виджет находится на панели приложения, приложение отображает виджет в виде значка. Если виджет находится в дополнительном меню, приложение отображает виджет как элемент меню. Когда пользователь взаимодействует с представлением действий, оно расширяется и заполняет панель приложения.
Например, следующий код добавляет виджет SearchView
на панель приложения:
<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" />
Если пользователь не взаимодействует с виджетом, приложение отображает виджет в виде значка, указанного в android:icon
. Если на панели приложения недостаточно места, приложение добавляет действие в дополнительное меню.
Когда пользователь касается значка или пункта меню, виджет расширяется и заполняет панель инструментов, позволяя пользователю взаимодействовать с ним.
Если вам нужно настроить действие, сделайте это в обратном вызове onCreateOptionsMenu()
вашей активности. Вы можете получить ссылку на объект представления действия, вызвав метод getActionView()
. Например, следующий код получает ссылку на объект для виджета SearchView
, определенного в предыдущем примере кода:
Котлин
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) }
Ява
@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); }
Реагировать на расширение представления действий
Если элемент <item>
действия имеет флаг collapseActionView
, приложение отображает представление действия в виде значка, пока пользователь не взаимодействует с представлением действия. Когда пользователь касается значка, встроенный обработчик onOptionsItemSelected()
расширяет представление действия. Если ваш подкласс активности переопределяет метод onOptionsItemSelected()
, ваш метод переопределения должен вызывать super.onOptionsItemSelected()
, чтобы суперкласс мог расширить представление действий.
Если вы хотите что-то сделать, когда действие развернуто или свернуто, вы можете определить класс, реализующий MenuItem.OnActionExpandListener
, и передать член этого класса в setOnActionExpandListener()
. Например, вы можете обновить действие в зависимости от того, развернуто или свернуто представление действий. В следующем фрагменте кода показано, как определить и передать прослушиватель:
Котлин
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 }
Ява
@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; }
Добавить поставщика действий
Чтобы объявить поставщика действий, создайте элемент <item>
в ресурсе меню панели инструментов, как описано в разделе Добавление и обработка действий . Добавьте атрибут actionProviderClass
и задайте для него полное имя класса для класса поставщика действий.
Например, следующий код объявляет ShareActionProvider
— виджет, определенный в библиотеке AndroidX, который позволяет вашему приложению обмениваться данными с другими приложениями:
<item android:id="@+id/action_share" android:title="@string/share" app:showAsAction="ifRoom" app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>
В этом случае нет необходимости объявлять значок для виджета, поскольку ShareActionProvider
предоставляет собственную графику. Если вы используете настраиваемое действие, объявите значок.
Дополнительные ресурсы
- См.
ShareActionProvider
для примера добавления действия «Поделиться» на верхнюю панель приложения. - Дополнительные сведения о создании поставщика настраиваемых действий см. в
ActionProvider