21

对于 android 平板电脑应用程序,我使用 2 个片段。一个在屏幕左侧,一个在右侧。当您单击右侧片段的按钮时,将在右侧片段的顶部添加另一个片段。这个片段被添加到后台堆栈。

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

问题是当我只想关闭[fragment 2]时,[fragment 3]也会被销毁。我可以通过调用手动删除片段

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment2).commit();

但后堆将保留

[片段 1] -> [(幽灵)片段 2] -> [片段 3]

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

有没有办法只从后台删除 [fragment 2] 并将 [fragment 3] 留在屏幕上?

4

4 回答 4

5

您可以简单地制作自己的后台堆栈并onBackPressed()以您认为合适的任何方式覆盖和处理它。我认为没有其他方法可以实现所需的行为。

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

于 2013-07-10T05:20:42.363 回答
2

我刚刚回答了一个类似的问题,所以这里是该答案的链接

该实现允许您Fragment从 backstack 中的任何位置删除 a ,这是通过使用 refrection 修改将 backstack 信息存储在 and 中的内部变量来实现FragmentManagerImplBackStackRecord

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

于 2014-03-02T09:46:13.803 回答
0

此解决方案仅适用于您的情况。您不需要将 Fragment2 放入 backstack。您可以做的是删除代码 'ft.addToBackStack("Fragment2");'。Fragment2 不在堆栈中。因此您关闭 Fragment2,并将 [fragment 3] 留在屏幕上。

于 2013-11-20T04:02:52.827 回答
0

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

于 2014-12-12T22:48:29.843 回答