Reputation: 735
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?
Upvotes: 1
Views: 2091
Reputation: 236
I guess you had to use 'findItem' instead of 'getItem' like
menu.findItem(R.id.whiteBalanceList).getSubMenu().removeItem(R.id.whiteBalanceAuto);
I would put more checks for NULL as well, just in case :)
Upvotes: 3
Reputation: 735
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);
}
Upvotes: 2
Reputation: 186
Maybe because your subMenus don't have any ID so that they can be pointed by your project R.java. Try givinh ID to your submenus also, then try again.
<?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
android:id="@+id/whiteSubMenu">
<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
android:id="@+id/flashSubMenu">
<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>
Also, it could be because use call remove method before menu inflated? Could you give your java code also?
Upvotes: 0