不播放弹出动画的情况下弹出片段回退栈

61

我使用以下代码将一个Fragment推到Fragment堆栈中:

FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right,
     R.anim.slide_in_left, R.anim.slide_out_left);
fragmentTransaction.replace(getId(), newFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
这种方法在片段堆栈弹出时会播放片段弹出动画,例如通过按下返回按钮。然而,有些情况下我想要在不显示此动画的情况下弹出片段回退堆栈,例如因为我刚从另一个活动中返回并且想立即显示以前的片段,而不需要动画效果。
示例导航可能如下所示:
- 用户位于具有根片段的开始屏幕上 - 他选择了根片段上的一个项目,该项目显示一个新片段来显示该项目的详细信息。它使用片段事务进行操作,为推送和弹出情况设置动画(因此当用户按返回按钮时,转换是动画的)。 - 从此片段开始一个活动,该活动(出于某种原因)删除了刚刚显示的项目。 - 当此活动完成时,我希望返回到根片段,而不显示“详细片段”的“弹出动画”。
有没有一种方法可以在不播放指定的弹出动画的情况下弹出片段回退堆栈?

你所说的“我刚刚从另一个活动返回”是什么意思?你能告诉我过渡步骤吗,也就是你尝试导航的方式。 - 500865
嗨500865,我在问题中添加了一个示例导航。 - ChristophK
在setCustomAnimations中将第三个和第四个参数设置为0不就可以实现这个效果吗? - Boy
这将在任何情况下禁用动画,但通常我想要动画,并且必须在片段推入堆栈时调用setCustomAnimations。 - ChristophK
你也可以尝试像这样 - MatrixDev
13个回答

0

只需使用setCustomAnimation()的另一个重载方法,在其中不设置R.anim.slide_out,这将解决您的问题。

干杯 :)


1
这样做会阻止用户按下返回按钮时播放任何动画,不是吗?我希望在默认情况下(用户按下返回按钮)有动画,但是有一种情况是在响应按钮推送时弹出片段堆栈,在这种情况下,我不想要动画。 - ChristophK

0

@Geoff 在 Kotlin 中的解决方案:

override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation {
    val a: Animation = object : Animation() {}
    a.duration = 0
    return a
}

如果你使用Navigation库,可以使用空动画代替:
val animation = NavOptions.Builder().build()

-1

回复Geoff和plackemacher的评论。

您可以尝试从此片段中删除所有视图。然后片段将显示,但应该是透明的。

删除所有-1(我使用导航抽屉,因此抽屉片段应保留)片段:

    int size = fragmentsList.size ()-1;

    FragmentTransaction transaction = fragmentManager.beginTransaction ();
    transaction.setTransition (FragmentTransaction.TRANSIT_NONE);

    Fragment fragment;

    for (int i = size ; i > 0 ; i--)
    {
        fragment = fragmentsList.get (i);
        if(fragment != null)
        {
            View viewContainer = fragment.getView ();
            if (viewContainer != null)
            {
                ((ViewGroup) viewContainer).removeAllViews ();
            }
            transaction.remove (fragment);
        }
    }

    size = fragmentManager.getBackStackEntryCount ();

    for (int i = 0; i < size  ; i++)
    {
        fragmentManager.popBackStack (null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

抱歉我的英语不好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接