アクションを追加して処理する

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

アプリバーのスペースには限りがあります。アプリがアプリバーに収まらない数のアクションを宣言する場合、アプリバーは超過したアクションをオーバーフロー メニューに送信します。また、アクションをアプリバーに表示する代わりに、オーバーフロー メニューに常に表示することもできます。

Now in Android アプリでアクションバー アイコンが表示されている画像
図 1. 「Now in Android」アプリのアクション アイコン

アクション ボタンを追加する

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

アクションバーに含めるアイテムごとに <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 属性は、アクションをアプリバーにボタンとして表示するかどうかを指定します。サンプルコードの favorite アクションのように app:showAsAction="ifRoom" を設定した場合、アプリバーにスペースがあればアクションはボタンとして表示されます。十分なスペースがない場合、超過したアクションはオーバーフロー メニューに送信されます。サンプルコードの settings アクションのように app:showAsAction="never" を設定した場合、アクションは常にオーバーフロー メニューに表示されますが、アプリバーには表示されません。

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

アクションに対応する

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

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

Kotlin

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

Java

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

    }
}