编辑:
找到了这个question,但添加menu.clear()只会在详细视图中显示菜单选项,在横向和改回纵向时,菜单不会更改。
我想更大的问题是如何处理各自具有菜单选项集的片段。
更新:
明确一下,如果设备保持纵向或横向模式,则菜单可以正常工作。当从横向模式旋转到纵向模式或反之亦然时,问题就会发生。即使调用onCreateOptionsMenu,菜单也似乎无法重置。
我是新手,请见谅如果没有做到顶尖的格式。我也有类似的问题,关于菜单贡献和Fragment
。以下是我在实例中所做的...
我有一个托管ListFragment
和显示列表项详细信息的其他Fragment
的FragmentActivity
- 这是相当典型的平板电脑配置。这个额外的详细Fragment
直到选择列表项后才会添加... 当我选择一个列表项时,我希望阻止ListFragment
的菜单项对托管FragmentActivity
的操作栏产生影响。(从用户界面的角度来看,用户的主要焦点是新添加的Fragment
,要返回到之前的状态,他们需要取消选择他们选择的选项。)由于ListFragment
不应该知道其他的 Fragment,为了确保可重用性,我发现在FragmentActivity
级别利用 onPrepareOptionsMenu(..)
方法是我正确的前进方式。
将以下代码片段添加到托管的FragmentActivity
中,即可快速获得所需的行为;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// 'Find' the menu items that should not be displayed - each Fragment's menu has been contributed at this point.
menu.findItem(id.sync).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}
FragmentActivity
可以操作活动UI,这是其授权角色之一。解决了这个问题,如果你使用了setRetainInstance(true)
,那么菜单将不会刷新。不幸的是,删除它会破坏其他东西,比如当改变方向时我的AsyncTask会被杀死。
由于您希望在每次屏幕方向改变时刷新充气菜单到操作栏,尝试在清单中声明您的活动以便片段可以监听配置更改。
然后重写onConfigurationChanged方法,并使用invalidateOptionMenu API,请参考此链接:
Activity invalidate options menu:
http://developer.android.com/reference/android/app/Activity.html#invalidateOptionsMenu%28%29
如果这篇文章对您有帮助,请将其标记为答案。