我在Android 4.0.4,HTC T-Mobile上看到以下错误信息:
我的程序在运行时更改选项菜单(即,使用“停止”按钮替换“开始”按钮)。不幸的是,溢出菜单消失了,并且至少有一个菜单项“丢失”。乍一看,看起来“更多”菜单项被另一个菜单项替换,在我的情况下是“设置”。
在Android 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"/>