从Android Backstack中删除一个特定片段

时间:2013-03-27 16:53:03

标签: android android-layout android-fragments

对于Android平板电脑应用程序,我使用2个片段。一个位于屏幕左侧,另一个位于右侧。当您单击右侧片段上的按钮时,将在右侧片段的顶部添加另一个片段。此片段将添加到Backstack中。

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.add(R.id.fragmentlayout, fragment2);
ft.addToBackStack("Fragment2");
ft.commit();

现在是背书:

[片段1] - > [片段2]

在左侧还有一个按钮,在左侧片段的顶部打开一个片段(与fragment2相同)并将其添加到backstack。后台现在是

[片段1] - > [片段2] - > [片段3]

片段2是关闭该片段的按钮。

getFragmentManager().popBackStack("Fragment2", FragmentManager.POP_BACK_STACK_INCLUSIVE);

问题是当我只想关闭[片段2]时,[片段3]也会被破坏。我可以通过调用

删除片段manualy
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment2).commit();

但是后座仍将是

[片段1] - > [(鬼)片段2] - > [片段3]

因此您需要再按一次才能关闭应用程序。

有没有办法只从背板上移除[片段2]并在屏幕上留下[片段3]?

4 个答案:

答案 0 :(得分:5)

您可以简单地创建自己的后台堆栈并覆盖onBackPressed()并以您认为合适的任何方式处理它。我认为没有任何其他方法可以达到预期的行为。

您自己的后台堆栈可能只是片段的ArrayList个标签。

答案 1 :(得分:1)

我刚刚回答了类似的问题,所以here's a link to that answer

该实现允许您从Backstack中的任何位置删除Fragment,这可以通过使用refrection来修改存储FragmentManagerImplBackStackRecord中的Backstack信息的内部变量来实现。

虽然我不鼓励使用它,但我希望它有所帮助。

答案 2 :(得分:0)

此解决方案仅适用于您的情况。 你不需要将Fragment2放入backstack。你可以做的是删除代码'ft.addToBackStack(“Fragment2”);'。 Fragment2不在堆栈中。所以你关闭Fragment2,然后在屏幕上留下[片段3]。

答案 3 :(得分:0)

您可以创建自己的片段管理器/观察者。它只是一个简单的列表或地图。使用标记或简单的类名(getClass)跟踪它们。这样您就可以避免创建新片段并重用缓存片段,从而控制内存消耗。 您还可以按照自己想要的方式操作片段(覆盖onBackPressed并推送您喜欢的片段),而不是仅使用Google说应该/可以完成的方式。