8

我有一个带有双窗格的活动:左侧的菜单项列表(片段 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 组件,请告诉我。

提前致谢。

4

2 回答 2

5

我可以通过缓存片段来做到这一点,因为我将它们添加到我自己的 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);
 }

后台监听器:

 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);
 }

希望这可以帮助。

于 2012-04-06T03:13:58.030 回答
0

Action Bar Sherlock (ABS) 需要重新创建操作栏,作为 ABS 3.x 中重新创建活动的一部分,但根据@Jake Wharton 的评论,版本 4 不需要重新创建——它可以处理方向变化。因此,设置 android:configChanges="orientation" 并且您的片段返回堆栈将持续存在。

于 2012-04-03T23:24:22.547 回答