最初隐藏的MenuItem不显示当调用setVisible(true)时

时间:2012-07-10 21:39:44

标签: android

我有一个基本问题,即最初隐藏的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的调用,但显示了相同的行为。

谢谢!

4 个答案:

答案 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);
                }

            });