运行时修改后,选项菜单中丢失的项目

时间:2013-01-11 06:00:28

标签: android menu menuitem android-4.0-ice-cream-sandwich android-optionsmenu

我在Android 4.0.4,HTC T-Mobile上看到以下错误信息:

我的程序在运行时更改选项菜单(即,使用“停止”按钮替换“开始”按钮)。不幸的是,溢出菜单消失了,并且至少有一个菜单项“丢失”。乍一看,看起来“更多”菜单项被另一个菜单项替换,在我的情况下是“设置”。

在Android 2上不会发生这种情况。

(我发现了一种解决方法,并且发布此信息以防其他人遇到此问题)

2 个答案:

答案 0 :(得分:1)

解决方法是不要让可见项的数量减少。看起来Android 4在不需要时会移除“更多”项目,但在需要时无法添加它。

我已从

更改了我的代码
private void doPrepareOptionsMenu(Menu menu) {
    boolean running = ...;
    menu.findItem(R.id.menu_stop).setVisible(running);
    menu.findItem(R.id.menu_start).setVisible(!running);
}

private void doPrepareOptionsMenu(Menu menu) {
    boolean running = ...;
    if (running) {
        menu.findItem(R.id.menu_stop).setVisible(running);
        menu.findItem(R.id.menu_start).setVisible(!running);
    } else {
        menu.findItem(R.id.menu_start).setVisible(!running);
        menu.findItem(R.id.menu_stop).setVisible(running);
    }
}

问题消失了。不同之处在于我们首先使一个项目可见,然后才使另一个项目不可见。

如果你从未在运行时更改过Android 2菜单,可以使用一些上下文:

SomeListener someListener = new SomeListener() {
    public void someStateChanged() {
        // This runs NOT on the UI thread
        runOnUiThread(new Runnable() {
            public void run() {
                updateUI();
            }
        });
     }
 }

updateUI()最终调用代码

Menu menu = weakRefOptionsMenu.get();
if (null != menu) {
    doPrepareOptionsMenu(menu);
}

当然,onPrepareOptionsMenu()也会调用doPrepareOptionsMenu()

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    doPrepareOptionsMenu(menu);
    return true;
}

答案 1 :(得分:1)

与原始问题相关的情况是,您有一个默认情况下不可见的菜单项。如果您计划在运行时根据某些逻辑显示此项目,则它不会出现在4.0.4设备上。修复程序包括一个禁用的,标题为空的可见项:

<item
    android:title=""
    android:visible="true"
    android:enabled="false"
    android:showAsAction="ifRoom"/>

<item
    android:id="@+id/my_item"
    android:title="My Item"
    android:visible="false"
    android:showAsAction="ifRoom"/>