【问题标题】:Calling setHasOptionsMenu(true) from a fragment results in multiple calls to onCreateOptionsMenu in Activity从片段调用 setHasOptionsMenu(true) 会导致在 Activity 中多次调用 onCreateOptionsMenu
【发布时间】:2014-04-04 18:40:44
【问题描述】:

我有一个简单的Activity,其中包含一个ViewPager。我正在尝试将一些菜单项从我的Fragments 之一添加到菜单中,但是我遇到了一些奇怪的行为。从我的片段中调用:setHasOptionsMenu(true); 会导致每次更改ViewPager 中的片段时都会调用封闭Activity 的onCreateOptionsMenu() 方法。这是正常的吗?

【问题讨论】:

    标签: android view android-activity android-viewpager fragment


    【解决方案1】:

    这绝对是“正常的”。它可能不适合您的特定用例,但它绝对是预期的行为。

    看看android.support.v4.app.Fragment.setHasOptionsMenu()的源码:

    public void setHasOptionsMenu(boolean hasMenu) {
        if (mHasMenu != hasMenu) {
            mHasMenu = hasMenu;
            if (isAdded() && !isHidden()) {
                mActivity.supportInvalidateOptionsMenu();
            }
        }
    }
    

    您可以看到它在其活动上调用supportInvalidateOptionsMenu(),这最终导致在活动及其所有片段上调用onCreateOptionsMenu()。当从 Activity 的片段管理器中添加/删除片段时,框架管理更新选项菜单的方式就是这样。

    【讨论】:

    • 谢谢,这确实让我现在很难过,但至少我知道这是有意的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多