我有一个双窗格的活动:左侧的菜单项列表(片段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组件而不会破坏并重新创建活动,请告诉我。
提前致谢。
答案 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”,你的片段返回堆栈将保持不变。