Androidでメニューバー(オプションメニュー)を出して見た。

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
今回もAndroid開発していきましょう。

#対象者
- Javaがなんとなく書ける人。
- Android開発が曖昧だけど多少できる人。

#オプションメニューの作り方
**(1)xml記述**
1) *オプションメニュー用のxmlファイルをres/menuフォルダ内にd¥作成する。*
->AndroidStudioでresフォルダを右クリックし、New > Android Resource File で表示 されるダイアログを使うと楽。
2) *menuタグ内にitemタグを記述する。* ->このitemタグ一つが選択肢一つ分となる。
3) *itemタグの属性のうち以下の3コは書いておく。*

- android:id : この選択肢のid
- android:title : 表示文字列
- app:showAsAction : アクションバーに表示するかどうか

**(2)サブメニュー**

メニュー用xmlファイルにおいてitemタグ内にさらにmenu-itemタグの組み合わせを記述す
る(入れ子にする)ことでサブメニューを表示できる。

**(3)showAsAction**

itemタグのapp:showAsAction属性には以下の3コの値がある。

- never : アクションバーに表示させずにオーバーフローメニュー
に格納する
- always : 常にアクションバーに表示する(あまりオススメしない) 
- ifRoom : アクションバーに余裕があるときのみ表示する

*(注意)*
``アクテビティクラスの親クラスがAppCompatActionではなく、単なるActivityの場合は android:showAsAction属性となる。``

**(4)アイコン**

itemタグのandroid:icon属性でメニューのアイコンを指定できる。 ただし、この属性が書かれた選択肢では以下の仕様となる。

- オーバーフローメニューではアイコンは表示されない。 
- アクションバーではアイコンのみ表示される 
- showAsAction属性に「|withText」を付記すると、端末サイズによってはメニュー名も表示される。

*(注意)*
``アイコン画像そのものは自作しても良いがAndroid SDKにも便利なものが用意されている。 それらを使用するには、「@android:drawable/ic_menu_...」と指定する。``
##サンプルコード

```xml
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menuReset"
        android:icon="@android:drawable/ic_menu_close_clear_cancel"
        android:title="@string/menu_reset"
        app:showAsAction="always|withText"/>
    <item
        android:id="@+id/menuFonttype"
        android:title="@string/menu_fonttype"
        app:showAsAction="never"
        >
        <menu>
            <item
                android:id="@+id/menuFonttypeSerif"
                android:title="@string/menu_fonttype_serif"
                app:showAsAction="never"/>
            <item
                android:id="@+id/menuFonttypeSunserif"
                android:title="@string/meun_fonttype_sunsserif"
                app:showAsAction="never"/>
            <item
                android:id="@+id/menuFonttypeMonospace"
                android:title="@string/menu_fontttype_monospace"
                app:showAsAction="never"/>
        </menu>
    </item>
    <item
        android:id="@+id/menuFontstyle"
        android:title="@string/menu_fontstyle"
        app:showAsAction="never"
        >
        <menu>
            <item
                android:id="@+id/menuFontstyleNormal"
                android:title="@string/menu_fontstyle_normal"
                app:showAsAction="never"/>
            <item
                android:id="@+id/menuFontstyleItalic"
                android:title="@string/menu_fontstyle_italic"
                app:showAsAction="never"/>
            <item
                android:id="@+id/menuFontstyleBold"
                android:title="@string/menu_fontstyle_bold"
                app:showAsAction="never"/>
            <item
                android:id="@+id/menuFontstyleBoldItalic"
                android:title="@string/menu_fontstyle_bolditalic"
                app:showAsAction="never"/>
        </menu>
    </item>
</menu>
```
#オプションメニューの表示
xmlファイルに記述したオプションメニューを表示するには、アクテビティクラスに
**onCreateOptionsMenu()**メソッドを記述する必要がある。
＊以下の記述は決まり文句として記述してください。何故なのかはわかりませんのでコメントください。

```java
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(オプションメニューのxmlファイル名, menu);
        return true;
    }
```

#選択時の処理 
オプションメニュー選択時の処理は**onCreateOptionsMenu()**メソッド内に記述する。
引数のitem(Menuitem型)は選択されたメニュー一つ分、この引数itemを使って以下のパターンで処理する。

1) *item.getItemId()で選択されたメニューのidを取得する。*
2) *xmlに記述したメニューのidのR値と比較して処理を分岐する。*->switch文が便利。

```java
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
       
        int itemId = item.getItemId();
        switch (itemId) {
            case R.id.ボタンのR値1:
                //処理１
                break;
            case R.id.ボタンのR値2:
                //処理2
                break;
                ...
                ...
       }
````
#TIPS
##インテントの戻るボタン
アクティビティクラスに以下を記述する。

```
android.support.v7.app.ActionBar actionbar = getSupportActionBar();
actionbar.setDisplayHomeAsUpEnabled(true);
```
**public boolean onOptionsItemSelected(MenuItem item) {**
のswitch文に以下を記述する。

```
case android.R.id.home:
        finish();
        db.close();
        break;
```

#追記（2018-11-11）
以上の手順で右上の所に以下のオプションメニューが出てくる。
<img width="56" alt="スクリーンショット 2018-11-11 15.52.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/116696/daa9ab36-5f68-5b2f-fc3b-c7317d3f8705.png">
タップすると、、、
<img width="154" alt="スクリーンショット 2018-11-11 15.53.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/116696/119ee612-3827-4589-7766-5818694211f2.png">
さらに「フォント」をタップすると、、、
<img width="131" alt="スクリーンショット 2018-11-11 15.53.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/116696/32a54653-ccb2-0136-7f28-6ba739980756.png">
「字体」をタップすると
<img width="131" alt="スクリーンショット 2018-11-11 15.54.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/116696/756007a0-43b4-399f-4edc-5bc28d8ea11b.png">
#追記（2018-11-30）
アイコンの一覧は[こちら](https://sites.google.com/site/technoute/android/icon/drawable)を参照して下さい。



以上。Androidでのメニューバーの出し方でした。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。