2013-09-20 1 views
1

Я создал список элементов в меню. Все эти элементы будут показаны в панели действий. Затем каждый элемент будет иметь подменю элементов снова.android: удалить элемент из подменю

пыльник мой XML-код:

<?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> 

При попытке удалить пункт подменю (для, например, я хочу, чтобы удалить пункт «Auto» под подменю «список White Balance») со следующим кодом:

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

Я получаю ошибку индекса outOfBoundException, потому что R.id.whiteBalanceList будет на самом деле привести к случайному уникальному номеру, но menu.size() только 2 ...

нО, если я ар emoveItem вместо т.е.

menu.removeItem(R.id.whiteBalanceList); 

Он работает отлично ...

любая идея, почему?

ответ

2

В конце концов я решил немного решить проблему. Ниже мой код:

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); 
} 
0

Возможно, потому, что ваш subMenus не имеет идентификатора, чтобы можно было указать ваш проект R.java. Попробуйте также использовать идентификатор givinh в своих подменю, затем повторите попытку.

<?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> 

Кроме того, это может быть связано с тем, что метод удаления вызова перед тем, как меню завышено? Не могли бы вы также указать свой код Java?

+0

Хмммм, я так не думаю ... Так как ошибка вызывается menu.getItem (R.id.whiteBalanceList), что означает, что я пытался получить элемент из меню первого уровня. Но попробуем, если Ур предложения работает! Попробуем в понедельник! Спасибо за предложение. снова дадут вам знать :) – CodingBird

+0

Я попытался добавить id в подменю и все еще не работает. Но я уже успел работать над своими приложениями. скоро опубликует ответ. Спасибо, что помогли помощнику! – CodingBird

3

Я думаю, вы должны были использовать «FindItem» вместо «» GetItem как

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

я бы поставил больше проверок на NULL, а также, на всякий случай :)