9

我正在覆盖 onPrepareOptionsMenu 来隐藏和显示菜单项。使用 API 级别 16 模拟器进行测试时;第一次打开菜单时不会调用 onPrepareOptionsMenu。但是当我重新打开菜单时,它可以工作。问题仅在于第一次使用。你可以用这个简单地测试它;

@Override
public void onPrepareOptionsMenu(Menu menu) {
    Toast.makeText(this.getActivity(), "pre", Toast.LENGTH_SHORT).show();
    super.onPrepareOptionsMenu(menu);
}

有任何想法吗?

4

2 回答 2

17

onPrepareOptionsMenu()每次用户打开 Gingerbread 及其下方的菜单时都会调用。从 Honeycomb 开始,当 ActionBar 中存在项目时,假定选项菜单始终处于打开状态。

如果您想在活动生命周期和onPrepareOptionsMenu()回调中更新选项菜单,您需要调用invalidateOptionsMenu()并且onPrepareOptionsMenu()将被调用。

你不能在onCreateOptionsMenu()回调中实现你第一次使用的代码吗?每次创建选项菜单时都会调用它,并且它是在首次使用时创建的。

于 2012-10-14T21:44:06.947 回答
5

这是 android 错误:https ://code.google.com/p/android/issues/detail?id=24231

当您第一次按下菜单按钮时,请致电invalidateOptionsMenu()supportInvalidateOptionsMenu()使用支持库。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch(keyCode) {
    case KeyEvent.KEYCODE_MENU:
        if(mIsMenuFirstClick) {
            mIsMenuFirstClick = false;
            supportInvalidateOptionsMenu();
        }
    }
    return super.onKeyDown(keyCode, event);
}
于 2014-03-03T12:38:32.050 回答