Android : Overflow メニューにアイコンを表示する
Overflow メニューに入れられたメニュー項目はそのままではアイコンが表示されませんが、以下の方法でアイコン表示を行うことができました。
コードで実現するバージョン
- 利点
- 標準的なメニューの見た目、挙動を保てる
- 欠点
- Reflection を使用しているので将来的にも動き続けるかは保障できないと思われる
具体的な方法はこちら。
Reflection を使って、メニュー作成時に Menu.setOptionalIconsVisible
を呼び出しています。
回答では onMenuOpened() を使っていますが、Fragment のメニューで実現する場合は onCreateOptionsMenu
に同じコードを入れて実現できました(featureId のチェックは省略)。コメントには onPrepareOptionsMenu
を使っている方がいましたが、onCreateOptionsMenu
で一度呼ぶだけで良さそうです。
また、proguard を使う(gradle で minifyEnabled true を指定)と、クラス名及びメンバー名が難読化されてそのままの設定では動かなくなってしまうので、プロジェクト中の proguard-rules.pro に以下の行を追加する必要があります。
-keep class android.support.v7.internal.view.menu.MenuBuilder { void setOptionalIconsVisible(boolean); }
メニュー xml のみで実現するバージョン
- 利点
- 簡単にできる
- 欠点
- Overflow アイコンを自分で用意する必要がある(標準で使われる Drawable はアプリからは参照できない模様)
- Material icons - Google Design の more_vert アイコンが標準のものに近い(縦の3点並び)です
- どのメニュー項目が Overflow メニューに配置されるかを決めておく必要がある(動的に変更できない)
- Overflow アイコンを自分で用意する必要がある(標準で使われる Drawable はアプリからは参照できない模様)
具体的な方法はこちら。
Overflow のアイコンと見せかけたメニューを置いて、そのメニューをクリックするとアイコンのあるサブメニューが開くという仕様です。上に挙げた欠点を許容できるのであれば、こちらが安牌のように思います(私はアイコンを設定する必要性がある点が扱いにくく感じたので、コードで行う方法を採用しましたが…)。