2

Fragment我用我自己的ActionBarActivity名字管理一些MainActivity。一次Fragment显示一个。这个例子应该很简单。在某些条件下Fragment,显示的内容应该有一个选项菜单。

这是我的代码:

public class MainActivity extends ActionBarActivity{

...

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // The certain conditions. You might know the background. ;-)
        final boolean hasMenu = mNavigationDrawer.isDrawerOpen() ? false : true;

        // The reference to the fragment which is shown
        mCurrentShownFragment.setHasOptionsMenu(hasMenu);

        return super.onCreateOptionsMenu(menu);

    }

...

}

因为mCurrentShownFragment.setHasOptionMenu(true) MainActivity's 和Fragment's的调用onCreateOptionMenu(...)被调用了两次。

第一个问题:为什么?
第二个问题:这样好吗?
第三个问题:如果第二个问题的答案是假的。我怎么能防止这种情况?

最好的问候,巴洛克

4

1 回答 1

1

看一下源码setHasOptionsMenu

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

它调用supportInvalidateOptionsMenu()

public void supportInvalidateOptionsMenu() {
    if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) {
        // If we are running on HC or greater, we can use the framework
        // API to invalidate the options menu.
        ActivityCompatHoneycomb.invalidateOptionsMenu(this);
        return;
    }

    mOptionsMenuInvalidated = true;
}

哪个电话invalidateOptionsMenu(this)

public void invalidateOptionsMenu () 在 API 级别 11 中添加

声明选项菜单已更改,因此应重新创建。该 onCreateOptionsMenu(Menu)方法将在下次需要显示时调用。

因此,将onCreateOptionsMenu原因称为setHasOptionsMenu工作原理是绝对正常的

于 2015-05-06T08:28:58.933 回答