2013-04-26 67 views
9

我们有一个Activity包含一个SlidingMenu(https://github.com/jfeinstein10/SlidingMenu),其中有三个选项,我们称它们为A,B1,C1。这些对应于我们在活动中显示的片段。当您从SlidingMenu中选择不同的选项时,我将通过FragmentManager将当前片段替换为新片段。清除Android Fragment没有弹出的背堆栈?

从片段B1你可以去其他两个,我们称他们为B2和B3。这里我们需要Back键带你从B2-> B1或者B3-> B1,所以我调用了transaction.addToBackStack(null)。如果我们在B2或B3上从SlidingMenu中选择一个选项,我们希望清除后退堆栈,因此我使用此问题Clear back stack using fragments中建议的代码,该代码调用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上按下后退键使我们回到C1,并带有相反的动画,而且都很好。

如果选择从SlidingMenu A或B1和我们popBackStack()来获取从后面堆摆脱C1的,那么它的幻灯片C2出来的权利,这看起来很奇怪。我想要做的是在不运行动画的情况下清除背面堆栈,但我找不到这样做的方法。我试着调用popBackStackImmediate()来代替,但这似乎没有任何区别。

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

回答

6

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

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

这似乎正是我所需要的。谢谢! – 2013-04-26 13:06:33

+0

@JonathanCaryl太棒了!我很高兴它的工作,因为我真的不是100%肯定会这样:) – TronicZomB 2013-04-26 13:07:24

+0

不支持我的支持库v23.1.1 – 2015-12-21 16:10:47

3

可悲的是,我不知道如何正确地做它所以这里是我的解决办法(实际上我已经相当改性其他计算器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变量。

+0

非常感谢你,它的工作很棒 – 2013-11-12 07:55:36