AndroidStudio オプションメニュー

AndroidStudioでのアプリのオプションメニューについてまとめていきます。

#オプションメニュー
**オプションメニュー**とは、``アクションバー（アプリバー）``に表示されるメニューのことです。
``アクションバー``には、**オプションメニュー**や、**オーバーフローメニュー**等を表示することが可能です。

![appbar_sheets_2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1098849/79e4a4d2-519e-b7c8-1749-e210b0bff351.png)
[参照](https://developer.android.com/training/appbar?hl=ja)

##オプションメニューを表示する
オプションメニューを表示させるには、以下の手順を踏みます。

**1,オプションメニュー用の.xmlファイルを作成する**
**2,.xmlファイルに専用タグを記述する**
**3,アクティビティに``onCreateOptionsMenu()メソッドを実装する``**

##1,オプションメニュー用の.xmlファイルを作成する

menuフォルダを右クリック>new>Menu Resouce File>OK

AndroidStudioではリソースファイル作成専用の機能があるので、利用する。

##2,.xmlファイルに専用タグを記述する
``menuタグ``内に選択肢1つにつき``itemタグ``を1つ記述します。
　``itemタグ``には　　
　　∟android:id
　　∟app:showAsAction
　　∟android:title
の3つの属性は必ず記述が必要

####サンプルコード

```menun.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/menuListOptionTeishoku"
        app:showAsAction="never"
        android:title="@string/menu_list_options_teishoku"/>

    <item
        android:id="@+id/menuListOptionCurry"
        app:showAsAction="never"
        android:title="@string/menu_list_options_curry"/>

</menu>
```

**android:id**:R値として使用するid

**app:showAsAction**:アクションバーに表示させるかどうかの設定

  ∟**showAsActionの属性値**

| 属性値 | 内容 |
|:-|:-|
|never   | その選択肢はオーバーフローメニューに格納される  |
|always   | 常にアクションバーに表示される。ただし、alwaysとすると、画面サイズによっては若干表示がずれてしまうこともあるので、ifRoomの使用が推奨されている。  |
|ifRoom   |アクションバーに表示する余裕がある場合は表示し、ない場合はオーバーフローメニューに格納する。   |

**android:title**:選択肢の表示文字列

####Tips メニューの入れ子
オプションメニューは、itemタグ内にさらにmenu-itemタグの組み合わせを記述することで、選択肢を入れ子にすることができます。

##3,アクティビティに``onCreateOptionsMenu()メソッドを実装する
####サンプルコード

```MainActivity.kt
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        //オプションメニュー用XMLファイルをインフレイト
        menuInflater.inflate(R.menu.menu_options_menu_list, menu)
        return true
    }
```

inflateメソッドの第1引数には、該当メニュー.xmlファイルのR値を指定する。

#コンテキストメニュー
コンテキストメニューとは、リストビューなどを長押しした時に表示されるメニューのことです。
![スクリーンショット 2021-06-16 15.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1098849/c60d11b2-f520-bd82-e708-0119f60edd1a.png)
[参照](https://developer.android.com/guide/topics/ui/menus?hl=ja)

##コンテキストメニューを表示する
コンテキストメニューは、オプションメニューとほぼ同じ手順となっています。
以下の手順。

**1,コンテキストメニュー用の.xmlファイルを作成する**
**2,.xmlファイルに専用タグを記述する**
**3,アクティビティに``onCreateContextMenu()メソッド``を実装する**
**4,onCreate()でコンテキストメニューを表示させる画面部品を登録する**

##1,コンテキストメニュー用の.xmlファイルを作成する
オプションメニューと同じです。

##2,.xmlファイルに専用タグを記述する
こちらもオプションメニューとほぼ同じです。
しかし、showAsAction属性は使えません。

###サンプルコード

```menu_context_menu_list.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuListContextInfo"
        android:title="@string/menu_list_context_desc" />
    <item
        android:id="@+id/menuListContextOrder"
        android:title="@string/menu_list_context_order" />

</menu>
```

##3,アクティビティに``onCreateContextMenu()メソッド``を実装する
return句が不要です。

###サンプルコード

```MainActivity.kt
    //コンテキストメニュー
    override fun onCreateContextMenu(menu: ContextMenu, view: View,
        menuInfo: ContextMenu.ContextMenuInfo) {
        //親クラスの同名のメソッドの呼び出し。
        super.onCreateContextMenu(menu, view, menuInfo)
        //コンテキストメニュー用xmlファイルをインフレイト
        menuInflater.inflate(R.menu.menu_context_menu_list, menu)
        //コンテキストメニューのヘッドタイトルを設定
        menu.setHeaderTitle(R.string.menu_list_context_header)
    }
```

##4,onCreate()でコンテキストメニューを表示させる画面部品を登録する
コンテクストメニューを表示するビュー、つまり、長押しを検知するビューをあらかじめ登録する必要がある。

MainActivity内のonCreate()メソッド内にregisterForContextMenu()メソッドを記述。
引数にはコンテキストメニューを表示させる画面部品を記述する。

```
registerForContextMenu(lvMenu)
```