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

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

Toolbar библиотеки AndroidX предоставляет пользователям различные способы взаимодействия с вашим приложением. В разделе «Добавление и обработка действий» описывается, как определить действие , которое может представлять собой кнопку или пункт меню. В этом документе описывается, как добавить два универсальных компонента:

  • Действие (action view) — это действие, предоставляющее расширенные функциональные возможности в панели приложения. Например, действие поиска (search action view) позволяет пользователю вводить поисковый запрос в панели приложения, не переключаясь между действиями или фрагментами.
  • Поставщик действий — это действие со своим собственным настраиваемым макетом. Изначально действие отображается как кнопка или пункт меню; когда пользователь нажимает на действие, поставщик действий управляет его поведением так, как вы это определите. Например, поставщик действий может реагировать на нажатие, отображая меню.

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

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() разворачивает представление действия. Если ваш подкласс активности переопределяет метод 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
}

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 .