Android アプリにメニューを追加する


リソース管理フォルダにメニュー用のフォルダを追加

resで右クリックして新規→Android リソース・ディレクトリーを選択

リソース・タイプの箇所で「menu」を選択して「OK」

メニュー用のリソースファイルを追加

追加したmenuフォルダで右クリックして新規→Menu リソース/ファイルを選択

名前は適当に入力して(今回は「option」と入力)「OK」

メニュー用リソースファイルを編集

「option.xml」というファイルが作成されるので、以下のように編集

option.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuItem1"
        android:title="メニュー1" />
    <item
        android:id="@+id/menuItem2"
        android:title="メニュー2" />
</menu>
アクティビティにメニューを紐付ける
MainActivity.java
public class MainActivity extends AppCompatActivity {
    ...

    // メニューをActivity上に設置する
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // 参照するリソースは上でリソースファイルに付けた名前と同じもの
        getMenuInflater().inflate(R.menu.option, menu);
        return super.onCreateOptionsMenu(menu);
    }

    // メニューが選択されたときの処理
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menuItem1:
                ...
                return true;

            case R.id.menuItem2:
                ...
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

これで(たったこれだけで)アプリの右肩あたりにメニューが表示される。

getMenuInfrater.infrate()するときに複数のメニューを紐付けることが可能。
例えば、アプリ共通のグローバルメニューをinfrate()しといて、画面固有のものをあとからinfrate()するといった感じ。

getMenuInfrater().inflate(R.menu.global_menu, menu);
getMenuInfrater().inflate(R.menu.sub_menu, menu);

この場合、各メニューのレイアウトファイルで

global_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuQuit"
        android:title="終了"
        android:orderInCategory="90"/>
</menu>
sub_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuSub1"
        android:title="サブメニュー"
        android:orderInCategory="1" />
    <item
        android:id="@+if/menuSub2"
        android:title="サブメニューその2"
        android:orderInCategory="2" />
</menu>

といった感じでorderInCategoryを指定してあげると、値の昇順に並べ替えて表示してくれるようになる。
もしこのやり方をやるなら、Androidの開発ガイドにも書かれてるとおり、共通のグローバルメニューに対応したonCreateOptionsMenu()とonOptionsItemSelected()が実装されたActivityを作成しておき、各Activityはこれを継承してオーバーライドしてやれば問題ない。

継承する場合は、onCreateOptionsMenu()内でsuper.onCreateOptionsMenu(menu);とやったあと、自Activityで利用させたいメニューについてはmenu.add()で追加していく形になるっぽい。