【问题标题】:android: remove an item from submenuandroid:从子菜单中删除一个项目
【发布时间】:2013-09-25 10:02:12
【问题描述】:

我在菜单中创建了项目列表。所有这些项目都将显示在操作栏中。然后每个项目将再次有一个项目的子菜单。

下面是我的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>

当我尝试使用以下代码删除子菜单项(例如,我想删除“白平衡列表”子菜单下的“自动”项)时:

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

我得到一个索引 outOfBoundException 的错误,因为 R.id.whiteBalanceList 实际上会产生随机唯一数字,但 menu.size() 只有 2...

但是,如果我改为使用 removeItem,即

menu.removeItem(R.id.whiteBalanceList);

完美运行...

知道为什么吗?

【问题讨论】:

    标签: android menu android-actionbar submenu


    【解决方案1】:

    可能是因为您的子菜单没有任何 ID,因此您的项目 R.java 可以指向它们。也尝试将 ID 分配给您的子菜单,然后再试一次。

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

    【讨论】:

    • Hmmmm 我不这么认为...由于 menu.getItem(R.id.whiteBalanceList) 引发了错误,这意味着我试图从一级菜单中获取该项目。 .但如果你的建议有效,我会试试!星期一会试试的!谢谢你的建议。会让你再次知道:)
    • 我已尝试将 id 添加到子菜单中,但仍然无法正常工作。但是通过一些变通方法,我的应用程序已经可以正常运行了。将很快发布答案。感谢您的帮助!
    【解决方案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);
    }
    

    【讨论】:

      【解决方案3】:

      我猜你必须使用 'findItem' 而不是像 'getItem' 这样的

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

      我也会对 NULL 进行更多检查,以防万一:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-15
        • 1970-01-01
        • 2014-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 2023-04-06
        相关资源
        最近更新 更多