0

我有一个与下图相同的活动:

手机与平板电脑

FragmentA 是一个列表视图,并有一个 SearchWidget 作为菜单项(旧设备上不显示,仅 API11 及更高版本)。FragmentB 是一个详细视图,有几个菜单项。

当 ActivityA 在平板电脑上运行时,FragmentA + FragmentB 的菜单项在操作栏中可见。这是正确的并且工作完美。

现在在 Nexus 7 上,我想要混合这些:

  • 纵向仅使用听筒布局
  • 当我旋转设备时,会加载平板电脑布局

我似乎无法工作的唯一事情是操作栏。当我将设备从横向模式(平板电脑视图)旋转回纵向(手机视图)时,操作栏仍然显示 FragmentA + FragmentB 的菜单项。

我尝试将 ActivityA 中的invalidateOptionsMenu()fromonResume()称为 FragmentA,但没有运气。

有人有想法吗?

4

2 回答 2

0

我认为这是应有的活动再创造过程。

当屏幕旋转时,您的活动被破坏(默认情况下)。但在它被销毁之前,它会保存状态,包括所有当前活动片段的状态。稍后,当活动在方向更改后创建时,它会恢复保存的状态(两个片段)。随着详细信息片段的恢复,它会附加菜单项。

您可以通过添加日志语句或使用调试器来检查这onCreateView一点DetailsFragment

如果是您的情况,那么您有下一个解决方案:

  1. 通过在活动保存其状态之前删除此片段来抑制保存状态(如果 DetailsFragment 应该跟踪最后显示的项目或类似的东西,则必须避免)。
  2. 如果 DetailsFragment 不会显示,则禁止对其进行任何初始化。活动应该给出关于可见性的答案。
  3. 你的变种?我认为上述两种方法还不够好......

对不起,如果我的回答对你没有帮助

于 2012-12-14T05:23:26.433 回答
0

这对我有用。在 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();
    }
}
于 2014-11-11T09:36:44.990 回答