i++

プログラム系のメモ書きなど

Android : Overflow メニューにアイコンを表示する

Overflow メニューに入れられたメニュー項目はそのままではアイコンが表示されませんが、以下の方法でアイコン表示を行うことができました。

f:id:tkyjhr:20151107113525p:plain:w360

コードで実現するバージョン

  • 利点
    • 標準的なメニューの見た目、挙動を保てる
  • 欠点
    • 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 はアプリからは参照できない模様)
    • どのメニュー項目が Overflow メニューに配置されるかを決めておく必要がある(動的に変更できない)

具体的な方法はこちら
Overflow のアイコンと見せかけたメニューを置いて、そのメニューをクリックするとアイコンのあるサブメニューが開くという仕様です。上に挙げた欠点を許容できるのであれば、こちらが安牌のように思います(私はアイコンを設定する必要性がある点が扱いにくく感じたので、コードで行う方法を採用しましたが…)。

参考