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して、その中で初期化処理を実装すればうまくいきます.