1

我在 Android 4.0.4 HTC T-Mobile 上看到以下错误功能:

我的程序在运行时更改了选项菜单(即,将“开始”按钮替换为“停止”按钮)。不幸的是,溢出菜单消失了,并且至少有一个菜单项“丢失”了。乍一看,“更多”菜单项似乎被另一个菜单项取代,在我的例子中是“设置”。

这在 Android 2 上不会发生。

(我找到了一个解决方法,并发布这个以防其他人遇到这个问题)

4

2 回答 2

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;
}
于 2013-01-11T06:21:53.047 回答
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"/>
于 2014-05-22T16:55:18.407 回答