アクションの追加と処理

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

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

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

        }
    }