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

Попробуйте Compose
Jetpack Compose – это рекомендуемый набор инструментов для создания пользовательского интерфейса в Android. Узнайте, как добавлять компоненты в Compose.

Класс 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, определенного в предыдущем примере кода:

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);
}

Как реагировать на развертывание представления действия

Если элемент <item> действия содержит флаг collapseActionView, приложение показывает представление действия в виде значка, пока пользователь не начнет взаимодействовать с представлением. Когда пользователь нажимает на значок, встроенный обработчик для onOptionsItemSelected() разворачивает представление действия. Если подкласс activity переопределяет метод onOptionsItemSelected(), то метод переопределения должен вызывать super.onOptionsItemSelected(), чтобы надкласс мог развернуть представление действия.

Если вы хотите, чтобы при развертывании или свертывании действия что-то происходило, вы можете определить класс, который реализует MenuItem.OnActionExpandListener, и передать элемент этого класса в setOnActionExpandListener(). Например, вы можете обновить действие в зависимости от того, развернуто или свернуто представление действия. В приведенном ниже фрагменте кода показано, как определить и передать прослушиватель.

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;
}

Добавить поставщика действий

Чтобы объявить поставщика действий, создайте элемент <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.