駆け出しエンジニアぱかぱかの成長記録

引くほど忘れっぽい新卒2年目駆け出しSEぱかぱかの備忘録です。

【Android】オーバーフローメニュー

こんばんは!仕事終わりのぱかぱかです!

今日も家に帰るとだダラけそうだったのでモスバーガーに来てしまいました笑

近所にあるし空いていて長居しても咎められない雰囲気なのでよく来てしまいます…

本日はスパイシーモスバーガーを注文!

スパイシーモス

あんまりお腹いっぱいにはならないので、帰ってまた食べてしまいそう…笑

 

本日はオーバーフローメニューについてまとめていきたいと思います!

 

オーバーフローメニューって何?

オーバーフローメニューはオプションメニューの一種です。

オプションメニューとは画面上部のアクションバーに表示されるメニューのこと。

タップするとさらに選択肢が表示される以下のようなメニューのことを言います。

タップすると出てくる

それでは早速作っていきましょう。

 

①メニュー用のxmlファイルを用意

メニュー用のxmlファイルはmenuタグで始まり

この中に選択肢1つにつきitemタグを1つ記述します。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/watchBirdAllList"
app:showAsAction="never"
android:title="@string/watch_bird_all_list" />
<item
android:id="@+id/watchBirdFavoriteList"
app:showAsAction="never"
android:title="@string/watch_bird_favorite_list" />
</menu>

今回はひとまず「すべての鳥」と「お気に入りの鳥」で

選択肢を2つ作ることにしました。

 

itemタグには以下の3つの属性を記述する必要があります。

・id

 R値として使用するid

・app:showAsAction

 選択肢をアクションバーに表示させるかの設定

 以下の3つの属性値がある

 ・never:選択肢をオーバーフローメニューに格納。

 ・always:常にアクションバーに表示

 ・ifRoom:余裕がある場合は表示

android:title

 選択肢の表示文字列

 

今回はneverを設定し選択肢をオーバーフローメニューに格納します。

ちなみにalwaysを選択すると以下のようになるみたいですよ。

ちょっと邪魔くさそう

 

②アクティビティでxmlファイルをインフレイト

まずインフレイトって何?って感じなのですが

inflateは膨らませるという意味で

Androidではxmlの画面部品をJavaオブジェクトにすることをこう言うみたいです。

メニューを表示させるにはアクティビティクラスにonCreateOptionMenu()メソッドを

記述して、その中でインフレイトしてあげる必要があります。

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
// オプションメニュー用xmlをインフレイト。
menuInflater.inflate(R.menu.menu_options_list, menu)
return true
}

メニューのインフレイトを行うクラスはMenuInflaterがあります。

アクティビティはMenuInflaterインスタンス

menuInflaterプロパティとして保持しているので

上記のようにインフレイトできます。

この内容はオプションメニューを表示するときの定型文のようなものみたいです。

 

③オプションメニュー選択時処理の実装

選択したメニューによって違う画面が表示されるように処理を記述します。

今回は戻るメニューを押したときの表示もついでに実装してます。

override fun onOptionsItemSelected(item: MenuItem): Boolean{
var returnVal = true
when(item.itemId) {
R.id.watchBirdAllList ->
// すべての鳥リストデータの生成。
_birdList = createWatchBirdList()
R.id.watchBirdFavoriteList ->
// すべての鳥リストデータの生成。
_birdList = createWatchBirdFavoriteList()
android.R.id.home ->
                   // 戻るボタンタップ時。
finish()
else ->
returnVal = super.onOptionsItemSelected(item)
}
val lvBirdList = findViewById<ListView>(R.id.lvWatchBirdList)
// SimpleAdapterを選択されたメニューデータで生成。
val adapter = SimpleAdapter(this@WatchBirdListActivity, _birdList, R.layout.row, _from, _to)
// アダプタの登録。
lvBirdList.adapter = adapter
return returnVal
}

 

そして完成した後の画面遷移イメージはこんな感じです!

メニューを押したら切り替わる

またさらにアプリらしくなってきました!

 

それでは今日はこの辺にします。

読んでいただきありがとうございました!