Используйте представления действий и поставщиков действий.

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 . Если на панели приложения недостаточно места, приложение добавляет действие в дополнительное меню.

Изображение, показывающее панель поиска с ведущими и конечными значками.
Рисунок 1. Панель поиска с ведущими и конечными значками.

Когда пользователь касается значка или пункта меню, виджет расширяется и заполняет панель инструментов, позволяя пользователю взаимодействовать с ним.

Изображение, показывающее вид поиска, открывающийся после того, как панель поиска окажется в фокусе.
Рисунок 2. Представление поиска открывается, когда панель поиска находится в фокусе.

Если вам нужно настроить действие, сделайте это в обратном вызове 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