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

时间:2013-04-26 12:08:45

标签: android android-fragments slidingmenu

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

从Fragment B1你可以去另外两个,我们称之为B2和B3。在这里,我们希望Back键带你从B2 - > B1或B3 - > B1,所以我调用transaction.addToBackStack(null)。如果我们在B2或B3上选择SlidingMenu中的一个选项,我们想要清除后面的堆栈,所以我使用这个问题Clear back stack using fragments中建议的代码,它调用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);

添加幻灯片动画,其中C1向右滑动,C2从右侧滑入,反之亦然。在C2上按下后退键,我们回到C1,带有反向动画,一切都很好。

BUT

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

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

2 个答案:

答案 0 :(得分:6)

您可以尝试以下操作,但我不熟悉.remove()它似乎应该做您想做的事情:

myFragmentClass myFragC1 = (myFragmentClass) getFragmentManager().findFragmentByTag("theTagYouUsedWhenAddingToBackStack");
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.remove(myFragC1);
transaction.commit();

答案 1 :(得分:4)

可悲的是,我不知道如何正确使用它所以这是我的解决方案(实际上我已经完全修改了其他stackoverflow answer

在由所有其他片段扩展的基本片段类中:

public static boolean sDisableExitAnimation = false;

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    if (sDisableExitAnimation && !enter) {
        return AnimationUtils.loadAnimation(getActivity(), R.anim.clear_stack_exit);
    }
    return super.onCreateAnimation(transit, enter, nextAnim);
}

要清除堆栈,您需要致电:

ScreenFragment.sDisableExitAnimation = true;
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

最后 clear_stack_exit 动画本身(我没有找到从FragmentManager本身获取它的方法):

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <alpha
        android:fromAlpha="1"
        android:toAlpha="0"
        android:duration="220"
        />

    <scale
        android:fromXScale="1"
        android:toXScale="0.975"
        android:fromYScale="1"
        android:toYScale="0.975"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="220"
        />

</set>

这样你就可以得到正确的清晰堆栈动画。在开始下一次转换之前,不要忘记清除sDisableExitAnimation变量。