19

アクティビティの 1 つに次のメニュー項目がある Android アプリケーションがあります (名前と MAC 番号のリストの処理に関するものです)。

<item android:id="@+id/menu_sort_tagg"
      android:icon="@android:drawable/ic_menu_sort_by_size"
      android:title="@string/menu_sort_list" >
      <menu> 
        <group android:checkableBehavior="single">
            <item android:id="@+id/sort_by_name"
                  android:title="@string/sort_by_name" />
            <item android:id="@+id/sort_by_mac"
                          android:title="@string/sort_by_mac" />

     </menu>
</item>

また、アプリケーションの状態が変化したときに、次のコードを使用して、前回使用された並べ替えオプション リストの項目を事前に確認できるようにしたいと考えています。

((MenuItem)findViewById(R.id.sort_by_name)).setChecked(true);

問題は、この特定の行でランタイム例外が発生することです。誰かが理由を知っていますか?

ログを見ると、ランタイム例外がヌル ポインター例外によってトリガーされていることがわかります。このようにコードを変更すると、次のようになります。

MenuItem mi = (MenuItem)findViewById(R.id.sort_by_name);
mi.setChecked(true);

seconds ステートメントで例外が発生していることが明らかになります。つまり、MenuItem mi が null です。では、なぜ最初のステートメントが正しい MenuItem へのポインタを持ってこないのでしょうか?

4

2 に答える 2

54

findViewById()ビューではなくメニューであるため、メニューに対してはできません。また、作成中または準備中にメニューの状態を変更できます。たとえば、オプション メニューを作成する場合は、次のActivity: onPrepareOptionsMenu()メソッドで実行できます。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    menu.findItem(R.id.sort_by_name).setChecked(true);
    //Also you can do this for sub menu
    menu.getItem(firstItemIndex).getSubMenu().getItem(subItemIndex).setChecked(true);
    return true;
}
于 2011-05-27T09:47:30.310 に答える