清除Android Fragment后台堆栈没有弹出?

Jon*_*ryl 9 android android-fragments slidingmenu

我们有一个包含SlidingMenu(https://github.com/jfeinstein10/SlidingMenu)的Activity,其中有三个选项,我们称之为A,B1,C1.这些对应于我们在活动中显示的片段.当您从SlidingMenu中选择其他选项时,我通过FragmentManager将新片段替换为新片段.

从片段B1你可以去另外两个,让我们称他们为B2和B3.在这里,我们希望Back键从B2 - > B1或B3 - > B1,所以我调用transaction.addToBackStack(null).如果我们在B2或B3上从SlidingMenu中选择一个选项,我们想要清除后面的堆栈,所以我使用这个问题中建议的代码使用调用popBackStack()的片段清除堆栈直到它清楚.

到现在为止还挺好.

从Fragment C1你可以去Fragment 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);
Run Code Online (Sandbox Code Playgroud)

添加幻灯片动画,当C2从右侧滑入时,C1向左滑动,反之亦然.在C2上按回车键将我们带回C1,带有反向动画,一切都很好.

如果你从SlidingMenu中选择A或B1,我们popBackStack()从后面的堆栈中删除C1,那么它会向右滑动C2,这看起来很奇怪.我想要做的是清除后台堆栈而不运行动画,但我找不到办法做到这一点.我试过调用popBackStackImmediate(),但这似乎没有任何区别.

作为替代方案,我想我可以完全避免调用addToBackStack,而是通过Activity.onBackPressed()手动处理用户按Back键,但也许有一个我看不到的解决方案?

Tro*_*omB 6

你可以尝试以下,虽然我不熟悉.remove()它似乎应该做你想要的:

myFragmentClass myFragC1 = (myFragmentClass) getFragmentManager().findFragmentByTag("theTagYouUsedWhenAddingToBackStack");
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.remove(myFragC1);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

  • 但我想这有一个问题,堆栈计数不会更新. (2认同)