Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将setShowAsActionFlags()添加到MenuItem会导致IndexOutOfBoundsException_Android_Android Actionbar_Menuitem - Fatal编程技术网

Android 将setShowAsActionFlags()添加到MenuItem会导致IndexOutOfBoundsException

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

我正在以编程方式将项目添加到操作栏。我正在使用在操作栏中标记图标。尝试设置MenuItem.setShowAsActionFlags()时,我收到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;
}
编辑:查看问题的源代码,问题似乎在这里:

 /**
 * 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;

}