21

我有一个基本问题,最初隐藏的 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

4 回答 4

26

问题是您没有告诉 Android 它需要更新菜单。在我找到解决方案之前,这让我在最后一个小时发疯了。我认为这在 HC 之前并不明显,因为菜单项并不总是像在 HC+ 中那样在屏幕上可见。

在您的活动中,只需调用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
this.invalidateOptionsMenu();
}

这将再次触发对 onCreateOptionsMenu() 事件的调用,因此,如果您在该函数中设置可见性以进行初始化,则需要考虑是否要显示该选项。

于 2012-07-31T15:12:29.950 回答
6

我遇到了同样的问题,我发现setVisible(true)当至少有另一个MenuItem可见时它可以工作。我希望这对某人有帮助。

于 2014-01-30T10:22:41.917 回答
6

我知道这是个老问题。
但我已经通过放置在里面解决了它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();
于 2016-08-11T07:01:53.007 回答
3

我发现使用视图的 post(Runnable) 方法来 setVisible 可以解决问题,所以类似于...

view.post(new Runnable() {

                @Override
                public void run() {
                    menu.findItem(id).setVisible(true);
                }

            });
于 2014-09-17T16:42:28.343 回答