gpt4 book ai didi

android - 为什么 Activity 的方法 onCreateOptionMenu() 通过使用 setHasOptionMenu(true) 来调用它的 Fragments 两次?

转载 作者:行者123 更新时间:2023-11-29 01:33:18 25 4
gpt4 key购买 nike

我在我自己的名为 MainActivityActionBarActivity 中管理一些 Fragment。一次显示一个 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) MainActivityFragmentonCreateOptionMenu(... ) 被调用了两次。

第一个问题:为什么?
第二个问题:可以吗?
第三题:如果第二题的答案是假的。我该如何防止这种情况发生?

最好的问候,巴洛克

最佳答案

看一下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 () Added in API level 11

Declare that the options menu has changed, so should be recreated. The onCreateOptionsMenu(Menu) method will be called the next time it needs to be displayed.

所以它调用 onCreateOptionsMenu 是绝对正常的,因为这就是 setHasOptionsMenu 的工作方式

关于android - 为什么 Activity 的方法 onCreateOptionMenu() 通过使用 setHasOptionMenu(true) 来调用它的 Fragments 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30071161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com