Androidアプリの上部にあるActionBar上のメニューを初期化しようとしてエラーが発生したのでその対処方法をまとめます.

事象

ActionBar上のメニューに表示させるアイコンを、SharedPreferencesの値によって変更しようと思い、onResumeの中でfindViewByIdによってMenuItemを取得しようとしました.

取得自体は正常にできたものの、MenuItemにキャストしようとした際に例外が発生してしまいました.

10-27 05:24:59.690: E/AndroidRuntime(4361): Caused by: java.lang.ClassCastException: com.android.internal.view.menu.ActionMenuItemView cannot be cast to android.view.MenuItem

メッセージを読むとActionMenuItemViewというクラスのインスタンスが取得できているため、そのクラスにキャストしようとしたところ、次のようなエラーに変わりました.

10-27 05:30:17.710: E/AndroidRuntime(4601): Caused by: java.lang.ClassCastException: com.android.internal.view.menu.ActionMenuItemView cannot be cast to android.support.v7.internal.view.menu.ActionMenuItemView

なるほど、よく見ると今キャストしていたのはsupportライブラリのクラスですが、取得できているのはAndroid本体のパッケージに属しています.

解決法

そもそもメニューの処理をonResume内で行おうとしていたのが誤りのようです.

Fragment#onCreateOptionsMenuの中で初期化処理を行うことで解決しました.

onCreateOptionsMenu内で初期化対象の項目を取得するには、Menu#findItemを利用します.

menu.findItem(R.id.foo);

表示の度に初期化を行うような場合(他の画面で設定された状態に応じてアイコンの出し分けを行う等)、onCreateOptionsMenuが呼ばれないタイミングがあることがわかりました.

この場合は、Fragent#onPrepareOptionsMenuをOverrideして、その中で初期化処理を実装すればうまくいきます.

Leave a Reply

Your email address will not be published. Required fields are marked *