我们有一个 Activity,其中包含一个 SlidingMenu ( https://github.com/jfeinstein10/SlidingMenu ),其中有三个选项,我们称它们为 A、B1、C1。这些对应于我们在活动中显示的片段。当您从 SlidingMenu 中选择不同的选项时,我会通过 FragmentManager 将当前片段替换为新片段。
您可以从片段 B1 转到另外两个,我们称它们为 B2 和 B3。在这里,我们希望 Back 键带您从 B2 -> B1 或 B3 -> B1,所以我调用 transaction.addToBackStack(null)。如果我们在 B2 或 B3 上时从 SlidingMenu 中选择一个选项,我们想要清除后退堆栈,所以我使用此问题中建议的代码使用调用 popBackStack() 的片段清除后退堆栈,直到清除为止。
到目前为止,一切都很好。
从片段 C1 可以转到片段 C2。由于 C1/C2 更像是我使用的主/详细设计
fragmentTransaction.setCustomAnimations(R.animator.slide_in_from_right,
R.animator.slide_out_to_left, R.animator.slide_in_from_left,
R.animator.slide_out_to_right);
添加一个幻灯片动画,其中 C1 向左滑出,而 C2 从右侧滑入,反之亦然。在 C2 上按 Back 键将我们带回 C1,并带有反向动画,一切都很好。
但
如果您从 SlidingMenu 中选择 A 或 B1,然后我们 popBackStack() 将 C1 从后面的堆栈中删除,那么它会将 C2 滑到右侧,这看起来很奇怪。我想做的是在不运行动画的情况下清除后台堆栈,但我找不到这样做的方法。我尝试改为调用 popBackStackImmediate() ,但这似乎没有任何区别。
作为替代方案,我想我可以完全避免调用 addToBackStack,而是通过 Activity.onBackPressed() 手动处理用户按下 Back 键,但也许有一个我看不到的解决方案?