9

我们有一个 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 键,但也许有一个我看不到的解决方案?

4

2 回答 2

6

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

myFragmentClass myFragC1 = (myFragmentClass) getFragmentManager().findFragmentByTag("theTagYouUsedWhenAddingToBackStack");
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.remove(myFragC1);
transaction.commit();
于 2013-04-26T12:21:30.350 回答
4

可悲的是,我不知道如何正确制作,所以这是我的解决方案(实际上我已经修改了其他 stackoverflow答案

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

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 变量。

于 2013-08-02T10:48:47.647 回答