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


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

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

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/21629/51b64ab8-a9b7-36de-ca74-6b92d35c07ac.jpeg)

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

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/21629/11691384-87fc-b94c-6be2-9fa5328bdbb6.jpeg)

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

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

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/21629/03df6daa-c859-729b-9b10-a9b7cda271c7.jpeg)

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

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/21629/67547504-824c-e138-a2e0-7e922348df7c.jpeg)

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

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

```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="メニュー１" />
    <item
        android:id="@+id/menuItem2"
        android:title="メニュー２" />
</menu>
```

##### アクティビティにメニューを紐付ける

```java: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()するといった感じ。

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

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

```xml: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>
```

```xml: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()で追加していく形になるっぽい。