从代码中选中一个菜单项

Rob*_*nat 16 android nullpointerexception menuitem runtimeexception

我有一个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>
Run Code Online (Sandbox Code Playgroud)

当应用程序状态发生变化时,我希望能够使用以下代码预先检查上次使用的排序选项列表中的哪个项目:

((MenuItem)findViewById(R.id.sort_by_name)).setChecked(true);
Run Code Online (Sandbox Code Playgroud)

问题是这个特定的行给了我一个运行时异常.有没有人知道为什么?

查看日志会发现运行时异常是由空指针异常触发的.通过这种方式更改代码:

MenuItem mi = (MenuItem)findViewById(R.id.sort_by_name);
mi.setChecked(true);
Run Code Online (Sandbox Code Playgroud)

很明显,异常发生在seconds语句中,即MenuItem mi为null.那么为什么第一个语句无法将指针指向正确的MenuItem?

Mic*_*ael 52

你不能做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;
}
Run Code Online (Sandbox Code Playgroud)


Key*_*iya 6

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);
}
Run Code Online (Sandbox Code Playgroud)
  • You can use this code one or multiple menuitems.

  • Just use 'item' from 'public boolean onOptionsItemSelected(MenuItem item)'

  • I used this, which worked for me. :)