为什么 Activity 的方法 onCreateOptionMenu() 通过使用 setHasOptionMenu(true) 来调用它的 Fragments 两次?
Why does Activity's method onCreateOptionMenu() get called two times by using setHasOptionMenu(true) for it's Fragments?
我在自己的 ActionBarActivity
中管理一些 Fragment
,名为 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
和Fragment
的onCreateOptionMenu(...)
被调用了两次
第一个问题:为什么?
第二个问题:可以吗?
第三题:如果第二题的答案是假的。我该如何防止这种情况?
此致,
巴洛克
看看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
的工作方式
我在自己的 ActionBarActivity
中管理一些 Fragment
,名为 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
和Fragment
的onCreateOptionMenu(...)
被调用了两次
第一个问题:为什么?
第二个问题:可以吗?
第三题:如果第二题的答案是假的。我该如何防止这种情况?
此致, 巴洛克
看看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
的工作方式