Android onConfigurationChanged:如何保存和恢复片段后端堆栈?

时间:2012-04-03 18:45:27

标签: android onconfigurationchanged back-stack

我有一个双窗格的活动:左侧的菜单项列表(片段M)和右侧当前所选项目的详细信息(片段D)。

当用户选择片段D中的项目时,片段D将被另一个片段替换(让我们称之为D1)。当用户选择片段D1中的项目时,片段D1将被另一个片段替换(让我们称之为D2),依此类推。 当然,当用户按下后退按钮时,她可以返回片段历史记录:D2-> D1-> D.

我的问题是:如何在配置更改时(特别是在屏幕方向上)保存和恢复完整的片段后端堆栈?

我觉得以前没有其他人遇到过这个问题,但我在Google和Stack Overflow上搜索时没有发现任何相关内容。如果我错过任何相关的帖子,请告诉我。

我知道我可以简单地将android:configChanges="orientation|screenSize"属性添加到我的活动中以避免重复活动,但我根本无法做到。

我不能这样做的原因是我使用Action Bar Sherlock(第4节)来实现向后兼容性,并且该组件需要活动重新创建才能在配置更改时正常运行,AFAIK。

如果有其他方法可以重新创建Action Bar Sherlock组件而不会破坏并重新创建活动,请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:5)

我能够通过缓存Fragments来实现这一点,因为我将它们添加到我自己的ArrayList中。然后我设置一个OnBackStackChangedListener来跟踪显示的那个,并根据需要弹出ArrayList。

我的目的有点不同,但下面的代码应该是您所描述的内容。如果需要,标签可以有多个后台堆栈。它不会按原样编译(我已经修剪了很多我自己的代码),但应该让你知道我是如何做到的。附加免责声明:我只是让这个工作正常,可能还有一些我还没有遇到的问题。

   public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag)
   {
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
      ft.detach(visibleFragment);
      ft.add(R.id.realtabcontent, fragment, tag);
      ft.attach(fragment);
      ft.addToBackStack(null);
      manualBackStacks.get(tag).add(fragment);
      ft.commit();
      this.getSupportFragmentManager().executePendingTransactions();
   }

您希望在方向更改后重新创建活动的代码:

 ArrayList<Fragment> backStack =
       new ArrayList<Fragment>(manualBackStacks.get(tag));
 popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote
 for (int bs = 1; bs < backStack.size(); bs++) {
    replaceFragmentWithBackStackForTag(backStack.get(bs), tag);
 }

backstack听众:

 public void onBackStackChanged() {
    int index = getSupportFragmentManager().getBackStackEntryCount();
    ArrayList<Fragment> backStack = manualBackStacks.get(tag);
    visibleFragment = backStack.get(index);
    // Pop the last element if we've backed up.
    popArrayListToIndex(backStack, index);
 }

希望这有帮助。

答案 1 :(得分:0)

Action Bar Sherlock(ABS)需要重新创建操作栏,作为在ABS 3.x中重新创建活动的一部分,但根据@ Jake Wharton's comment,版本4不需要重新创建 - 它可以处理方向更改。因此,设置android:configChanges =“orientation”,你的片段返回堆栈将保持不变。