旋转和多窗格时Android操作栏刷新

时间:2012-11-07 11:54:22

标签: android android-fragments android-actionbar actionbarsherlock

我的活动与下图相同:

Handset vs Tablet

FragmentA是一个listview,它有一个SearchWidget作为菜单项(旧设备上没有显示,只有API11及以上版本)。 FragmentB是一个详细视图,有几个菜单项。

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

现在在Nexus 7上,我想要混合使用:

  • 仅限肖像使用手机布局
  • 当我旋转设备时,平板电脑布局已加载

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

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

有没有人有想法?

2 个答案:

答案 0 :(得分:0)

我认为这是适当的活动重新创建过程。

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

您可以通过在onCreateView的{​​{1}}中添加日志语句或使用调试器来检查此问题。

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

  1. 通过在活动保存状态之前移除此片段,禁止保存状态(必须避免,如果DetailsFragment应跟踪上次显示的项目或类似内容)。
  2. 如果不显示DetailsFragment,则禁止任何初始化。活动应该给出关于可见性的答案。
  3. 你的变种?我认为上述两种方法都不够好......
  4. 很抱歉,如果我的答案对你没有任何帮助

答案 1 :(得分:0)

这对我有用。 在活动A中尝试查找片段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();
    }
}