2017-06-17 28 views
0

accesing菜單項我有一個菜單 -有時獲取IndexOutOfBound而在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 IN-

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來包含錯誤並採取了適當的步驟,但我想知道是什麼導致錯誤。

編輯:堆棧跟蹤

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) 
+0

你能粘貼整個堆棧跟蹤嗎? –

+1

由其ID得到一個菜單項,使用'則findItem()'代替。 'getItem()'通過索引檢索。 –

回答

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 
} 
+0

謝謝,但你能解釋爲什麼它有時會正常工作嗎? – string24

+0

我不知道它如何正確工作。 :( –

0

爲getItem期待的位置,而不是一個id改變這一行

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