简而言之,这是我的问题:
可以在Android 3.0 +上以编程方式修改选项菜单(显示在操作栏中)吗?
我有一个向导式活动,我在其中使用ViewFlipper在视图或步骤之间切换。
步骤是:1(无) - > 2(菜单) - > 3(没什么)。
只有第二个屏幕(2)有一个菜单项,而其他屏幕没有,所以我需要在显示活动时隐藏/删除菜单,然后在操作后显示/添加。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.mMenu = menu;
getMenuInflater().inflate(R.menu.my_menu, menu);
mMenu.getItem(0).setVisible(false);
return super.onCreateOptionsMenu(menu);
}
切换到第二个屏幕 - >
public void showNext(View v) {
if (mVFlipper.getDisplayedChild() < (mVFlipper.getChildCount() - 1)) {
mVFlipper.showNext();
if (mVFlipper.getDisplayedChild() == 1) {
setTitle("Second screen");
mMenu.getItem(0).setVisible(true);
}
}
}
这在2.2上运行良好,但在4.1上失败了。从可见的MenuItem开始,隐藏它并在以后显示它。从隐藏的菜单项开始并稍后显示它不起作用。
我的主要问题似乎是在onCreateOptionsMenu完成执行后,MenuItem是不可见的。我可以让MenuItem保持对这个方法可见,但我没有其他可用的回调来隐藏它。
答案 0 :(得分:4)
Android的MenuItem setVisible中存在一个错误,在将项目恢复为可见时会导致问题。
在你的onCreateOptionsMenu()中,添加一个检查以查看显示的页面是否需要菜单,如果是,则添加MenuItem。然后,每当页面更改时调用invalidateOptionsMenu()。这将重建菜单。
答案 1 :(得分:1)
通过在onCreateOptionsMenu完成后将MenuItem显示然后将其隐藏在onCreateOptionsMenu之后调用的回调中来解决问题:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.mMenu = menu;
getMenuInflater().inflate(R.menu.my_menu, menu);
boolean dummyVal = super.onCreateOptionsMenu(menu);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
mMenu.getItem(0).setVisible(true);
} else {
mMenu.getItem(0).setVisible(false);
}
return dummyVal;
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
if (mMenu != null) {
mMenu.getItem(0).setVisible(false);
}
}
}
如果有人遇到此问题,我建议先尝试toadzky的建议:调用“invalidateOptionsMenu()”。
答案 2 :(得分:1)
我也在努力解决这个问题,然后我应用了一个小黑客:
menu1.setEnabled(false);
menu1.setTitle("");
然后你想再次看到它的地方:
menu1.setEnabled(true);
menu1.setTitle("Okay"); //or you can set text according to your given updated values.