【问题标题】:Android actionbar refresh when rotating and multi-pane旋转和多窗格时Android操作栏刷新
【发布时间】:2012-11-07 11:54:22
【问题描述】:
我有一个与下图相同的活动:
FragmentA 是一个列表视图,并有一个 SearchWidget 作为菜单项(旧设备上不显示,仅 API11 及更高版本)。
FragmentB 是一个详细视图,有几个菜单项。
当 ActivityA 在平板电脑上运行时,FragmentA + FragmentB 的菜单项在操作栏中可见。这是正确的,而且效果很好。
现在在 Nexus 7 上,我想要混合使用这些:
- 在纵向仅使用手机布局
- 当我旋转设备时,会加载平板电脑布局
我似乎无法正常工作的是操作栏。当我将设备从横向模式(平板电脑视图)旋转回纵向(手机视图)时,操作栏仍然显示 FragmentA + FragmentB 的菜单项。
我尝试在两个 ActivityA 中将 invalidateOptionsMenu() 从 onResume() 调用为 FragmentA,但没有运气。
有人有想法吗?
【问题讨论】:
标签:
android
android-fragments
android-actionbar
actionbarsherlock
【解决方案1】:
我认为这是应有的活动再创造过程。
当屏幕旋转时,您的 Activity 将被销毁(默认情况下)。
但在它被销毁之前,它会保存状态,包括所有当前活动片段的状态。
稍后,当活动在方向更改后创建时,它会恢复保存的状态(两个片段)。随着详细信息片段的恢复,它会附加菜单项。
您可以通过在onCreateView of DetailsFragment 中添加日志语句或使用调试器来检查这一点。
如果是你的情况,那么你有下一个解决方案:
- 通过在 Activity 保存其状态之前删除此 Fragment 来抑制保存状态(如果 DetailsFragment 应跟踪最后显示的项目或类似内容,则必须避免)。
- 如果 DetailsFragment 不显示,则禁止对其进行任何初始化。活动应该给出关于可见性的答案。
- 你的变种?我认为上述两种方法还不够好......
对不起,如果我的回答对你没有帮助
【解决方案2】:
这对我有用。
在 Activity A 中尝试找到 Fragment B 并设置 setHasOptionsMenu(mTwoPane)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_document_list);
Fragment fragment = getFragmentManager().findFragmentByTag(TAG_FRAGMENT_DETAIL);
if (getResources().getBoolean(R.bool.has_detail)){
mTwoPane = true;
....
}
if (fragment != null) {
fragment.setHasOptionsMenu(mTwoPane);
invalidateOptionsMenu();
}
}