ActionBarに表示したメニューアイコンを動的に変更してみる。

次の図にあるActionBarのアイコンを押すとアイコンが切り替わるものを作ってみる。

 003

Empty Activityの1つのプロジェクトを用意する。
on.png、off.pngを用意してリソースのdrawableに追加する。
次のようなメニューリソース(main_menu.xml)を用意する。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/lamp"
        android:icon="@drawable/off"
        app:showAsAction="always" />
</menu>

MainActivityクラスにこのボタンの状態を表す変数を用意する。

    // trueで点灯
    private boolean lamp = false;

onCreateOptionsMenuをオーバーライドしてメニューを用意する。ここで状態を保存している変数lampをみてアイコンを変更する。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);

        MenuItem menuLamp = menu.findItem(R.id.lamp);
        if(lamp) {
            menuLamp.setIcon(R.drawable.on);
        } else {
            menuLamp.setIcon(R.drawable.off);
        }
        return true;
    }

アイコン(メニュー)を選択したときの処理を追加する。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.lamp:
                // 状態を反転
                lamp = !lamp;
                // メニューの再作成するように設定する
                invalidateOptionsMenu();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

ようは、invalidateOptionsMenu()を呼ぶことでメニューを再作成するようにして、メニューを再作成することだ。