从片段调用setHasOptionsMenu(true)会导致对Activity中的onCreateOptionsMenu进行多次调用

时间:2014-03-03 16:03:47

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

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

1 个答案:

答案 0 :(得分:16)

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

看一下android.support.v4.app.Fragment.setHasOptionsMenu()的来源:

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

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