我有一个基本问题,即最初隐藏的MenuItem无法切换为可见。作为一个警告,我正在使用ActionBarSherlock,但我想知道是否有人知道这是否是一个已知的Android问题,或者我在做一些可怕的事情,然后再调查这是否是ABS内部的一个问题。代码如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.menu_xml, menu);
mMenuItem = menu.findItem(R.id.menu_item);
mMenuItem.setVisible(false);
return true;
}
// Somewhere elsewhere
// MenuItem is never visible after this line is executed
mMenuItem.setVisible(true);
我还尝试将mMenuItem赋值和可见性移动到对onPrepareOptionsMenu的调用,但显示了相同的行为。
谢谢!
答案 0 :(得分:25)
问题是你没有告诉Android它需要更新菜单。这让我坚持了最后一小时,直到我找到了解决方案。我不认为它在pre-HC上是显而易见的,因为菜单项并不总是在屏幕上可见,就像它们在HC +中一样。
在您的活动中,只需致电:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
this.invalidateOptionsMenu();
}
这将再次触发对onCreateOptionsMenu()事件的调用,因此如果您要在该函数中设置可见性以进行初始化,则需要考虑,如果您想要显示或不显示该选项。
答案 1 :(得分:6)
我遇到了同样的问题,当发现至少另一个setVisible(true)
可见时,我发现MenuItem
有效。我希望这对某人有所帮助。
答案 2 :(得分:3)
我明白这是个老问题
但我已经通过置于onPrepareOptionMenu() {...}
内解决了这个问题。
private boolean mShowVisible=false;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.menu_item).setVisible(mShowVisible);
return super.onPrepareOptionsMenu(menu);
}
无论何时您想要设置可见或不将其称为:
mShowVisible = true; // or false
invalidateOptionMenu();
答案 3 :(得分:1)
我发现使用视图的post(Runnable)方法来设置setVisible可以解决这个问题,所以就像......
view.post(new Runnable() {
@Override
public void run() {
menu.findItem(id).setVisible(true);
}
});