TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Androidでメニューをグレーアウトさせる

openOptionsMenuで開いたメニューのアイテムを状態によって無効化したい場合、
onPrepareOptionsMenuで、

item.setEnabled(false);

のようにすればよいのだが、
こうすると、確かにメニューは押しても反応しなくなるのだが、
見た目がグレーアウトしない。

いろいろ調べたら、
menu - Is it possible to grey out (not just disable) a MenuItem in Android? - Stack Overflow

setColorFilterを使う方法や、setAlphaを使う方法で対処するようだ。
しかし、テキストのみのメニューアイテムには使えない。

上記のURLの最後に書いてあるが、
APIレベル < 14だと正しくグレーアウトされるようだ。
手元のAndroid 2.3の端末で試したらちゃんとグレーアウトされた。

APIレベル >= 14だとどうしたらよいかわからず。


試しに、コンパチブルライブラリのスタイルで
ActionBarの機能を使うように変更してみた。

styles.xmlのテーマを

<style name="AppTheme" parent="android:Theme.NoTitleBar">

から

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

に変更。

おおっ!ちゃんとグレーアウトされるようになったよ。

ついでにメニューの表示のされ方も横に並んでたのが、縦に並ぶようになった。

デフォルトだとメニューの背景が透明で見にくかったので、
背景色を変更した。

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="android:panelBackground">@android:color/background_dark</item>
</style>


互換性を気にするなら、素直にコンパチブルライブラリを使ったほうがよさそうだ。