0
我正在以編程方式將項目添加到操作欄。我正在使用ViewBadger()來標記操作欄中的圖標。嘗試設置MenuItem.setShowAsActionFlags()時,我得到IndexOutOfBoundsException。如果我註釋掉這一行,我不會有任何錯誤。在我能看到的代碼中沒有發生異常,但是在系統代碼中。將setShowAsActionFlags()添加到MenuItem導致IndexOutOfBoundsException
從logcat中,錯誤發生在ViewGroup.addInArray()。可能是什麼問題呢?
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
LinearLayout container = new LinearLayout(this);
container.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
int count = 0;
//Battery///////////////////////////
MenuItem menuItemBattery = menu.add(0,Menu.NONE,count,"Battery Level");
menuItemBattery.setIcon(getResources().getDrawable(R.drawable.ic_action_battery));
count++;
//menuItemBattery.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
// The badge view requires target view (iconView in this case)
// to have a ViewGroup parent
ImageButton iconViewBattery = new ImageButton(this);
iconViewBattery.setImageDrawable(menuItemBattery.getIcon());
container.addView(iconViewBattery);
BadgeView badge2 = new BadgeView(this, iconViewBattery);
if (batteryPercent > 30) {
badge2.setTextColor(Color.WHITE);
badge2.setBadgeBackgroundColor(Color.GREEN);
} else if (batteryPercent > 10 && batteryPercent < 31) {
badge2.setTextColor(Color.BLACK);
badge2.setBadgeBackgroundColor(Color.YELLOW);
} else if (batteryPercent < 11) {
badge2.setTextColor(Color.BLACK);
badge2.setBadgeBackgroundColor(Color.RED);
}
badge2.setText(String.valueOf(batteryPercent));
badge2.setTextSize(12);
badge2.show();
menuItemBattery.setActionView(container);
//subject
if (!GlobalVars.subjectGUID.equalsIgnoreCase("")) {
MenuItem menuItemSubject = menu.add(0,Menu.NONE,count,"Subject");
count++;
menuItemSubject.setIcon(getResources().getDrawable(R.drawable.ic_action_person));
menuItemSubject.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
ImageButton iconViewSubject = new ImageButton(this);
iconViewSubject.setImageDrawable(menuItemSubject.getIcon());
container.addView(iconViewSubject);
menuItemSubject.setActionView(container);
}
//new data
if (GlobalVars.newdata.equalsIgnoreCase("1")) {
MenuItem menuItemNewData = menu.add(0,Menu.NONE,count,"New Data");
count++;
menuItemNewData.setIcon(getResources().getDrawable(R.drawable.ic_action_import_export));
menuItemNewData.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
ImageButton iconViewNewData = new ImageButton(this);
iconViewNewData.setImageDrawable(menuItemNewData.getIcon());
container.addView(iconViewNewData);
menuItemNewData.setActionView(container);
}
//Airplane Mode
//////////////////////////////////////////////////////////////
if (noConnectivity && airplaneModeOn) {
MenuItem menuItemAirplane = menu.add(0,Menu.NONE,count,"Airplane Mode");
count++;
menuItemAirplane.setIcon(getResources().getDrawable(R.drawable.ic_action_airplane_mode_on));
//menuItemAirplane.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
ImageButton iconView = new ImageButton(this);
iconView.setImageDrawable(menuItemAirplane.getIcon());
menuItemAirplane.setActionView(container);
}
return true;
}
的logcat:
10-30 09:55:26.277: E/AndroidRuntime(10834): FATAL EXCEPTION: main
10-30 09:55:26.277: E/AndroidRuntime(10834): java.lang.IndexOutOfBoundsException: index=1 count=0
10-30 09:55:26.277: E/AndroidRuntime(10834): at android.view.ViewGroup.addInArray(ViewGroup.java:3426)
10-30 09:55:26.277: E/AndroidRuntime(10834): at android.view.ViewGroup.addViewInner(ViewGroup.java:3361)
10-30 09:55:26.277: E/AndroidRuntime(10834): at android.view.ViewGroup.addView(ViewGroup.java:3210)
10-30 09:55:26.277: E/AndroidRuntime(10834): at android.view.ViewGroup.addView(ViewGroup.java:3155)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.view.menu.BaseMenuPresenter.addItemView(BaseMenuPresenter.java:129)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:103)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.view.menu.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:188)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:244)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:946)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.view.menu.MenuBuilder.startDispatchingItemsChanged(MenuBuilder.java:969)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:450)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:769)
10-30 09:55:26.277: E/AndroidRuntime(10834): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:201)
10-30 09:55:26.277: E/AndroidRuntime(10834): at android.os.Handler.handleCallback(Handler.java:725)
10-30 09:55:26.277: E/AndroidRuntime(10834): at android.os.Handler.dispatchMessage(Handler.java:92)
10-30 09:55:26.277: E/AndroidRuntime(10834): at android.os.Looper.loop(Looper.java:137)
編輯:看問題的源代碼,似乎問題就在這裏:
/**
* Add an item view at the given index.
*
* @param itemView View to add
* @param childIndex Index within the parent to insert at
*/
protected void addItemView(View itemView, int childIndex) {
final ViewGroup currentParent = (ViewGroup) itemView.getParent();
if (currentParent != null) {
currentParent.removeView(itemView); //INDEX OUT OF BOUNDS
}
((ViewGroup) mMenuView).addView(itemView, childIndex);
}