【问题标题】:Jelly bean not calling onPrepareOptionsMenu() when opening the menu for the first time第一次打开菜单时果冻豆不调用 onPrepareOptionsMenu()
【发布时间】:2012-10-04 21:40:38
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: android android-4.1-jelly-bean


    【解决方案1】:

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

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

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

    【讨论】:

    • 你是从哪里调用的?
    【解决方案2】:

    是安卓bug: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);
    }
    

    【讨论】:

    • 效果很好,谢谢!请注意,在某些情况下,它应该是 ActivityCompat.invalidateOptionsMenu(this);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多