Search code examples
androidmenuandroid-actionbarsubmenu

android: remove an item from submenu


I created list of items in a menu. All these items will be shown in the action bar. Then each item will have a submenu of items again.

Bellow is my xml code:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sceneMenu" >

<item
    android:id="@+id/whiteBalanceList"
    android:icon="@drawable/white_balance_list"
    android:showAsAction="always"
    android:title="@string/selWhiteBalance">
    <menu>
        <item
            android:id="@+id/whiteBalanceAuto"
            android:title="Auto" />
        <item
            android:id="@+id/whiteBalanceCloudy"
            android:title="Cloudy Daylight" />
        <item
            android:id="@+id/whiteBalanceDaylight"
            android:title="Daylight" />
        <item
            android:id="@+id/whiteBalanceFluorescent"
            android:title="Fluorescent" />
        <item
            android:id="@+id/whiteBalanceIncandescent"
            android:title="Incandescent" />
        <item
            android:id="@+id/whiteBalanceShade"
            android:title="Shade" />
        <item
            android:id="@+id/whiteBalanceTwilight"
            android:title="Twilight" />
        <item
            android:id="@+id/whiteBalanceWarm"
            android:title="Warm Fluorescent" />  
    </menu>
</item>
<item
    android:id="@+id/flashList"
    android:icon="@drawable/flash_list"
    android:showAsAction="always"
    android:title="@string/selFlash">
    <menu>
        <item
            android:id="@+id/flashAuto"
            android:title="Auto"/>
        <item
            android:id="@+id/flashOn"
            android:title="On"/>
        <item
            android:id="@+id/flashOff"
            android:title="Off"/>
    </menu>
</item>  
</menu>

When I try to remove the submenu item (for e.g. I want to remove the item "Auto" under 'White Balance List' submenu) with the following code:

menu.getItem(R.id.whiteBalanceList).getSubMenu().removeItem(R.id.whiteBalanceAuto);

I get an error of index outOfBoundException because R.id.whiteBalanceList will actually result in random unique number but menu.size() is only 2...

BUT if I do a removeItem instead i.e.

menu.removeItem(R.id.whiteBalanceList);

It runs perfectly...

any idea why?


Solution

  • I did some work-around to solve the problem in the end. Below is my code:

    MenuItem whiteMenu = null;
    for (int i = 0; i < menu.size(); i++) {
        if (menu.getItem(i).getItemId() == R.id.whiteBalanceList) {
            whiteMenu = menu.getItem(i);
            break;
        }
    }
    if (whiteMenu != null)
        checkWhiteBalance(whiteList, whiteMenu.getSubMenu());
    
    private void checkWhiteBalance(List<String> list, Menu menu) {
        if (!list.contains(Camera.Parameters.WHITE_BALANCE_AUTO))
            menu.removeItem(R.id.whiteBalanceAuto);
        if (!list.contains(Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT))
            menu.removeItem(R.id.whiteBalanceCloudy);
        if (!list.contains(Camera.Parameters.WHITE_BALANCE_DAYLIGHT))
            menu.removeItem(R.id.whiteBalanceDaylight);
        if (!list.contains(Camera.Parameters.WHITE_BALANCE_FLUORESCENT))
            menu.removeItem(R.id.whiteBalanceFluorescent);
        if (!list.contains(Camera.Parameters.WHITE_BALANCE_INCANDESCENT))
            menu.removeItem(R.id.whiteBalanceIncandescent);
        if (!list.contains(Camera.Parameters.WHITE_BALANCE_SHADE))
            menu.removeItem(R.id.whiteBalanceShade);
        if (!list.contains(Camera.Parameters.WHITE_BALANCE_TWILIGHT))
            menu.removeItem(R.id.whiteBalanceTwilight);
        if (!list.contains(Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT))
            menu.removeItem(R.id.whiteBalanceWarm);
    }