我在 Android 4.0.4 HTC T-Mobile 上看到以下错误功能:
我的程序在运行时更改了选项菜单(即,将“开始”按钮替换为“停止”按钮)。不幸的是,溢出菜单消失了,并且至少有一个菜单项“丢失”了。乍一看,“更多”菜单项似乎被另一个菜单项取代,在我的例子中是“设置”。
这在 Android 2 上不会发生。
(我找到了一个解决方法,并发布这个以防其他人遇到这个问题)
我在 Android 4.0.4 HTC T-Mobile 上看到以下错误功能:
我的程序在运行时更改了选项菜单(即,将“开始”按钮替换为“停止”按钮)。不幸的是,溢出菜单消失了,并且至少有一个菜单项“丢失”了。乍一看,“更多”菜单项似乎被另一个菜单项取代,在我的例子中是“设置”。
这在 Android 2 上不会发生。
(我找到了一个解决方法,并发布这个以防其他人遇到这个问题)
解决方法是不要让可见项目的数量减少。看起来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;
}
与原始问题相关的是,您有一个默认情况下不可见的菜单项。如果您计划基于某些逻辑在运行时使该项目可见,它将不会出现在 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"/>