有时在Android中访问菜单项时获取IndexOutOfBound

时间:2017-06-17 17:48:00

标签: android

我有一个菜单 -

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context="com.example.ju_group.health_assist.MainActivity">
    <item
        android:id="@+id/help"
        android:checkable="false"
        android:icon="@android:drawable/ic_menu_help"
        android:title="Help"
        app:showAsAction="ifRoom"/>
    <group
        android:id="@+id/disable"
        android:checkableBehavior="all"
        android:visible="true">
        <item
            android:id="@+id/dis_new"
            android:title="Disable PopUp"
            android:visible="true"/>

    </group>
</menu>

所以我在 -

中访问了项目dis_new
    getMenuInflater().inflate(R.menu.menu_main, menu);
    if(disable_popup==1)
        menu.getItem(R.id.dis_new).setChecked(true); //here I'm getting error
        return true;  //we have inflated the menu
    }

disable_popup早先设置为1或0,具体取决于某些条件 现在,当我设置项目时,我收到了IndexOutOfBound异常 但很多时候它被正确执行(disable_popup值为0和1)。

java.lang.IndexOutOfBoundsException: Invalid index 2131624239, size is 2

是异常消息。

我使用try-catch来包含错误并采取了适当的步骤,但我想知道导致错误的原因。

编辑:stacktrace

FATAL EXCEPTION: main
  Process: com.example.*******, PID: 829
  java.lang.IndexOutOfBoundsException: Invalid index 2131624239, size is 2
 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
 at java.util.ArrayList.get(ArrayList.java:308)
 at android.support.v7.view.menu.MenuBuilder.getItem(MenuBuilder.java:741)
 at com.example.*****.SymptomsAnalyze.onCreateOptionsMenu(SymptomsAnalyze.java:113)
 at android.app.Activity.onCreatePanelMenu(Activity.java:2538)
 at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:362)
 at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:98)
 at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:335)
 at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:98)
 at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
 at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61)
 at android.os.Handler.handleCallback(Handler.java:733)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:136)
 at android.app.ActivityThread.main(ActivityThread.java:5017)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:515)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
 at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:0)

getItem期待一个位置,而不是id改变这一行

  menu.getItem(R.id.dis_new) to this menu.getItem(1)

答案 1 :(得分:0)

方法menu.getItem(int)用于通过索引访问菜单项(例如:0,1,2)。如果您想按ID访问菜单项,则应使用menu.findItem(int)

getMenuInflater().inflate(R.menu.menu_main, menu);

    if(disable_popup==1)
         menu.findItem(R.id.dis_new).setChecked(true); //findItem() instead of getItem()

    return true;  //we have inflated the menu
}