【问题标题】:Set a menu item as checked from code将菜单项设置为从代码中检查
【发布时间】:2011-09-03 06:03:36
【问题描述】:

我有一个 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 为空。那么为什么第一条语句无法将指针指向正确的 MenuItem?

【问题讨论】:

  • 您好,您可以给我们看一个异常的日志吗?
  • 当然,这是错误日志输出: 11:38:34.562: ERROR/AndroidRuntime(14371): FATAL EXCEPTION: main 05-27 11:38:34.562: ERROR/AndroidRuntime(14371): java.lang.RuntimeException: 无法启动活动 ComponentInfo{se.classis.safe.android/se.classis.safe.android.TagListActivity}: java.lang.NullPointerException 05-27 11:38:34.562: ERROR/AndroidRuntime(14371 ): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 05-27 11:38:34.562: 错误/AndroidRuntime(14371): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 05- 27 11:38:34.562: 错误
  • 似乎来自空指针异常。 findViewById 是否无法提供指向我们要检查的菜单项的指针?
  • 是的,我认为问题在于,你确定你的 xml 是正确的吗?
  • 我认为您在菜单的最后一项之后忘记了 标记..

标签: android nullpointerexception menuitem runtimeexception


【解决方案1】:

你不能为菜单做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;
}

【讨论】:

    【解决方案2】:
    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);
    }
    
    • 您可以使用此代码一个或多个菜单项。

    • 只需使用 'public boolean onOptionsItemSelected(MenuItem item)'中的 'item'

    • 我使用了这个,它对我有用。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多