web-dev-qa-db-ja.com

コードからチェックしたメニュー項目を設定します

アクティビティの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);

問題は、この特定の行で実行時例外が発生することです。誰かがなぜ手がかりを持っていますか?

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

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

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

17
Robert Granat

メニューはビューではなくメニューであるため、メニューに対して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;
}
53
Michael
private boolean _isHidden = false;

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId())
    {
        case R.id.hiddenfiles:
            if(!_isHidden)
            {
                _isHidden = true;
                item.setChecked(true);
            }
            else {
                _isHidden = false;
                item.setChecked(false);
            }
    }

    return super.onOptionsItemSelected(item);
}
  • このコードは、1つまたは複数のメニュー項目を使用できます。

  • 'item' from 'public boolean onOptionsItemSelected(MenuItem item)'を使用するだけです

  • 私はこれを使用しました、それは私のために働きました。 :)

2
Keyur Sureliya