Добавляйте и обрабатывайте действия

Панель приложения позволяет добавлять кнопки для действий пользователя. Эта функция позволяет разместить наиболее важные действия для текущего контекста в верхней части приложения. Например, приложение для просмотра фотографий может отображать кнопки «Поделиться» и «Создать альбом» вверху, когда пользователь просматривает свою фотопленку. Когда пользователь просматривает отдельную фотографию, приложение может отображать кнопки обрезки и фильтрации .

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

Изображение «Сейчас в приложении Android» со значком на панели действий.
Рис. 1. Значок действия в приложении «Теперь в Android».

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

Все кнопки действий и другие элементы, доступные в переполнении действий, определены в ресурсе XML-меню . Чтобы добавить действия на панель действий, создайте новый XML-файл в каталоге res/menu/ вашего проекта.

Добавьте элемент <item> для каждого элемента, который вы хотите включить в панель действий, как показано в следующем примере XML-файла меню:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- "Mark Favorite", must appear as action button if possible. -->
    <item
        android:id="@+id/action_favorite"
        android:icon="@drawable/ic_favorite_black_48dp"
        android:title="@string/action_favorite"
        app:showAsAction="ifRoom"/>

    <!-- Settings, must always be in the overflow. -->
    <item android:id="@+id/action_settings"
          android:title="@string/action_settings"
          app:showAsAction="never"/>

</menu>

Атрибут app:showAsAction указывает, отображается ли действие в виде кнопки на панели приложения. Если вы установите app:showAsAction="ifRoom" — как в любимом действии в примере кода — действие отображается в виде кнопки, если для него есть место на панели приложения. Если места недостаточно, лишние действия отправляются в дополнительное меню. Если вы установите app:showAsAction="never" — как в примере действия настроек кода — действие всегда отображается в дополнительном меню и не отображается на панели приложения.

Система использует значок действия в качестве кнопки действия, если действие отображается на панели приложения. Вы можете найти много полезных иконок в Material Icons .

Реагировать на действия

Когда пользователь выбирает один из элементов панели приложения, система вызывает метод обратного вызова onOptionsItemSelected() вашей активности и передает объект MenuItem , чтобы указать, какой элемент был нажат. В вашей реализации onOptionsItemSelected() вызовите метод MenuItem.getItemId() чтобы определить, какой элемент был нажат. Возвращаемый идентификатор соответствует значению, объявленному вами в атрибуте android:id соответствующего элемента <item> .

Например, следующий фрагмент кода проверяет, какое действие выбирает пользователь. Если метод не распознает действие пользователя, он вызывает метод суперкласса:

Котлин

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
    R.id.action_settings -> {
        // User chooses the "Settings" item. Show the app settings UI.
        true
    }

    R.id.action_favorite -> {
        // User chooses the "Favorite" action. Mark the current item as a
        // favorite.
        true
    }

    else -> {
        // The user's action isn't recognized.
        // Invoke the superclass to handle it.
        super.onOptionsItemSelected(item)
    }
}

Ява

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            // User chooses the "Settings" item. Show the app settings UI.
            return true;

        case R.id.action_favorite:
            // User chooses the "Favorite" action. Mark the current item as a
            // favorite.
            return true;

        default:
            // The user's action isn't recognized.
            // Invoke the superclass to handle it.
            return super.onOptionsItemSelected(item);

    }
}