6 月 3 日の「#Android11: The Beta Launch Show」にぜひご参加ください。

アクションの追加と処理

アプリバーでは、ユーザー アクション用のボタンを追加できます。この機能を使用すると、現在のコンテキストで最も重要なアクションをアプリの一番上に配置できます。たとえば写真閲覧アプリでは、ユーザーが自分の写真ロールを見ているとき、共有ボタンとアルバム作成ボタンを一番上に表示できます。ユーザーが個々の写真を見ると、アプリに切り抜きボタンとフィルタボタンが表示されます。

アプリバーのスペースには限りがあります。アプリバーに収まらないほど多くのアクションをアプリが宣言すると、アプリバーは超過したアクションをオーバーフロー メニューに送信します。アプリは、アクションをアプリバーに表示するのではなく、常にオーバーフロー メニューに表示するように指定することもできます。

図 1. 単一のアクション ボタンとオーバーフロー メニューを備えたアプリバー。

アクション ボタンの追加

アクション オーバーフローで使用可能なすべてのアクション ボタンとその他のアイテムは、XML メニュー リソースで定義されています。アクションバーにアクションを追加するには、プロジェクトの res/menu/ ディレクトリに新しい XML ファイルを作成します。

メニュー XML ファイルの次のコード例に示すように、アクションバーに含める各アイテムに <item> 要素を追加します。

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

        <!-- "Mark Favorite", should 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, should 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" を(サンプルコードの favorite アクションのように)設定すると、アクションのためのスペースがアプリバーにある場合、アクションはボタンとして表示されます。十分なスペースがない場合、超過したアクションがオーバーフロー メニューに送信されます。app:showAsAction="never" を(サンプルコードの settings アクションのように)設定すると、アクションは常にオーバーフロー メニューにリストされ、アプリバーには表示されません。

アクションがアプリバーに表示されている場合、システムはアクションのアイコンをアクション ボタンとして使用します。マテリアル アイコンページに、便利なアイコンが多数掲載されています。

アクションへの対応

ユーザーがアプリバーのアイテムのいずれかを選択すると、システムはアクティビティの onOptionsItemSelected() コールバック メソッドを呼び出し、MenuItem オブジェクトを渡して、クリックされた項目を示します。onOptionsItemSelected() の実装では、MenuItem.getItemId() メソッドを呼び出して、押されたアイテムを判別します。返される ID は、対応する <item> 要素の android:id 属性で宣言した値と一致します。

たとえば次のコードは、ユーザーが選択したアクションを確認します。メソッドがユーザーのアクションを認識しない場合は、スーパークラス メソッドを呼び出します。

Kotlin

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

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

        else -> {
            // If we got here, the user's action was not recognized.
            // Invoke the superclass to handle it.
            super.onOptionsItemSelected(item)
        }
    }
    

Java

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

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

            default:
                // If we got here, the user's action was not recognized.
                // Invoke the superclass to handle it.
                return super.onOptionsItemSelected(item);

        }
    }