Android 将setShowAsActionFlags()添加到MenuItem会导致IndexOutOfBoundsException
我正在以编程方式将项目添加到操作栏。我正在使用在操作栏中标记图标。尝试设置MenuItem.setShowAsActionFlags()时,我收到IndexOutOfBoundsException。如果我把这行注释掉,就不会有错误。我能看到的代码中并没有发生异常,而是在系统代码中 从logcat中,错误发生在ViewGroup.addInArray()处。有什么问题吗Android 将setShowAsActionFlags()添加到MenuItem会导致IndexOutOfBoundsException,android,android-actionbar,menuitem,Android,Android Actionbar,Menuitem,我正在以编程方式将项目添加到操作栏。我正在使用在操作栏中标记图标。尝试设置MenuItem.setShowAsActionFlags()时,我收到IndexOutOfBoundsException。如果我把这行注释掉,就不会有错误。我能看到的代码中并没有发生异常,而是在系统代码中 从logcat中,错误发生在ViewGroup.addInArray()处。有什么问题吗 @Override public boolean onCreateOptionsMenu(Menu menu) { th
@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;
}
编辑:查看问题的源代码,问题似乎在这里:
/**
* 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);
}
似乎我并没有为所有的菜单项找一个家长,只是其中的一些。向每个项目添加布局可防止IndexOutOfBounds。代码:
public boolean onCreateOptionsMenu(Menu menu) {
//getMenuInflater().inflate(R.menu.home, menu);
MenuItem menuItemNewData;
MenuItem menuItemSubject;
MenuItem menuItemBattery;
MenuItem menuItemAirplane;
LinearLayout container = new LinearLayout(this);
container.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
container.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
int count = 0;
//Battery///////////////////////////
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("")) {
LinearLayout container2 = new LinearLayout(this);
container2.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
container2.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemSubject = menu.add(0,Menu.NONE,count,"Subject");
menuItemSubject.setIcon(getResources().getDrawable(R.drawable.ic_action_person));
ImageButton iconViewSubject = new ImageButton(this);
iconViewSubject.setImageDrawable(menuItemSubject.getIcon());
container.addView(iconViewSubject);
count++;
menuItemSubject.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItemSubject.setActionView(container2);
}
//new data
if (GlobalVars.newdata.equalsIgnoreCase("1")) {
LinearLayout container3 = new LinearLayout(this);
container3.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
container3.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemNewData = menu.add(0,Menu.NONE,count,"New Data");
menuItemNewData.setIcon(getResources().getDrawable(R.drawable.ic_action_import_export));
ImageButton iconViewNewData = new ImageButton(this);
iconViewNewData.setImageDrawable(menuItemNewData.getIcon());
container.addView(iconViewNewData);
//container.addView((View)menuItemNewData);
count++;
menuItemNewData.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItemNewData.setActionView(container3);
}
//Airplane Mode
//////////////////////////////////////////////////////////////
if (noConnectivity && airplaneModeOn) {
LinearLayout container4 = new LinearLayout(this);
container4.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
container4.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemAirplane = menu.add(0,Menu.NONE,count,"Airplane Mode");
menuItemAirplane.setIcon(getResources().getDrawable(R.drawable.ic_action_airplane_mode_on));
ImageButton iconViewAirplane = new ImageButton(this);
iconViewAirplane.setImageDrawable(menuItemAirplane.getIcon());
container4.addView(iconViewAirplane);
count++;
menuItemAirplane.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItemAirplane.setActionView(container4);
}
return true;
}
public boolean oncreateoptions菜单(菜单菜单){
//getMenuInflater().充气(R.menu.home,menu);
MenuItem menuItemNewData;
MenuItem menuItemSubject;
MenuItem menuItemBattery;
MenuItem menuItemAirplane;
LinearLayout容器=新的LinearLayout(此);
container.setLayoutParams(新的LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_内容,
ViewGroup.LayoutParams.WRAP_CONTENT);
container.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
整数计数=0;
//电池组///////////////////////////
menuItemBattery=menu.add(0,menu.NONE,计数,“电池电量”);
menuItemBattery.setIcon(getResources().getDrawable(R.drawable.ic_action_battery));
计数++;
menuItemBattery.setShowAsActionFlags(MenuItem.ShowAsAction\uIf\uRoom);
//徽章视图需要目标视图(本例中为iconView)
//要拥有视图组父级,请执行以下操作:
ImageButton IConView电池=新的ImageButton(此);
iconViewBattery.setImageDrawable(menuItemBattery.getIcon());
container.addView(IConView电池);
BadgeView badge2=新的BadgeView(此为IConView电池);
如果(电池电量>30){
徽章2.setTextColor(颜色:白色);
徽章2.setBadgeBackgroundColor(颜色:绿色);
}否则如果(电池电量>10和电池电量<31){
徽章2.setTextColor(颜色:黑色);
徽章2.背景色(颜色:黄色);
}否则如果(电池电量<11){
徽章2.setTextColor(颜色:黑色);
徽章2.setBadgeBackgroundColor(颜色:红色);
}
badge2.setText(String.valueOf(batteryPercent));
徽章2.setTextSize(12);
2.show();
menuItemBattery.setActionView(容器);
//主题
如果(!GlobalVars.subjectGUID.equalsIgnoreCase(“”){
LinearLayout container2=新的LinearLayout(本);
container2.setLayoutParams(新的LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_内容,
ViewGroup.LayoutParams.WRAP_CONTENT);
container2.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemSubject=menu.add(0,menu.NONE,count,“Subject”);
menuItemSubject.setIcon(getResources().getDrawable(R.drawable.ic_action_person));
ImageButton iconViewSubject=新建ImageButton(此);
iconViewSubject.setImageDrawable(menuItemSubject.getIcon());
container.addView(iconViewSubject);
计数++;
menuItemSubject.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItemSubject.setActionView(container2);
}
//新数据
if(GlobalVars.newdata.equalsIgnoreCase(“1”){
LinearLayout container3=新的LinearLayout(本);
container3.setLayoutParams(新的LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_内容,
ViewGroup.LayoutParams.WRAP_CONTENT);
container3.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemNewData=menu.add(0,menu.NONE,count,“新数据”);
menuItemNewData.setIcon(getResources().getDrawable(R.drawable.ic_action_import_export));
ImageButton iconViewNewData=新的ImageButton(此);
iconViewNewData.setImageDrawable(menuItemNewData.getIcon());
container.addView(iconviewData);
//container.addView((视图)menuItemNewData);
计数++;
menuItemNewData.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItemNewData.setActionView(container3);
}
//飞行模式
//////////////////////////////////////////////////////////////
if(无连接和airplaneModeOn){
LinearLayout container4=新的LinearLayout(本);
container4.setLayoutParams(新的LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_内容,
ViewGroup.LayoutParams.WRAP_CONTENT);
container4.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemAirplane=menu.add(0,menu.NONE,计数,“飞机模式”);
menuItemAirplane.setIcon(getResources().getDrawable(R.drawable.ic_action_plane_mode_on));
ImageButton IConViewWairPlane=新的ImageButton(此);
iconViewAirplane.setImageDrawable(menuItemAirplane.getIcon());
容器4.添加视图(IConviewIrplane);
计数++;
menuItemAirplane.setShowAsActionFlags(MenuItem.ShowAsAction总是);
menuItemAirplane.setActionView(container4);
}
返回true;
}
public boolean onCreateOptionsMenu(Menu menu) {
//getMenuInflater().inflate(R.menu.home, menu);
MenuItem menuItemNewData;
MenuItem menuItemSubject;
MenuItem menuItemBattery;
MenuItem menuItemAirplane;
LinearLayout container = new LinearLayout(this);
container.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
container.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
int count = 0;
//Battery///////////////////////////
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("")) {
LinearLayout container2 = new LinearLayout(this);
container2.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
container2.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemSubject = menu.add(0,Menu.NONE,count,"Subject");
menuItemSubject.setIcon(getResources().getDrawable(R.drawable.ic_action_person));
ImageButton iconViewSubject = new ImageButton(this);
iconViewSubject.setImageDrawable(menuItemSubject.getIcon());
container.addView(iconViewSubject);
count++;
menuItemSubject.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItemSubject.setActionView(container2);
}
//new data
if (GlobalVars.newdata.equalsIgnoreCase("1")) {
LinearLayout container3 = new LinearLayout(this);
container3.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
container3.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemNewData = menu.add(0,Menu.NONE,count,"New Data");
menuItemNewData.setIcon(getResources().getDrawable(R.drawable.ic_action_import_export));
ImageButton iconViewNewData = new ImageButton(this);
iconViewNewData.setImageDrawable(menuItemNewData.getIcon());
container.addView(iconViewNewData);
//container.addView((View)menuItemNewData);
count++;
menuItemNewData.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItemNewData.setActionView(container3);
}
//Airplane Mode
//////////////////////////////////////////////////////////////
if (noConnectivity && airplaneModeOn) {
LinearLayout container4 = new LinearLayout(this);
container4.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
container4.setBackgroundColor(getResources().getColor(R.color.headerPalePurple));
menuItemAirplane = menu.add(0,Menu.NONE,count,"Airplane Mode");
menuItemAirplane.setIcon(getResources().getDrawable(R.drawable.ic_action_airplane_mode_on));
ImageButton iconViewAirplane = new ImageButton(this);
iconViewAirplane.setImageDrawable(menuItemAirplane.getIcon());
container4.addView(iconViewAirplane);
count++;
menuItemAirplane.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItemAirplane.setActionView(container4);
}
return true;
}