Android - 片段事务上的自定义动画未运行

时间:2012-06-14 21:04:47

标签: android android-fragments android-animation

我正在使用支持包v4的Google API 8(Android 2.2)。

它不会给出任何错误或动画。

交易:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.replace(R.id.content, myFragment);
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.commit();

动画:

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="700"
        android:fromXDelta="-100%"
        android:toXDelta="0%" >
    </translate>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="700"
        android:fromXDelta="0%"
        android:toXDelta="100%" >
    </translate>
</set>

有谁知道这里发生了什么?

5 个答案:

答案 0 :(得分:239)

在我设置动画之前,管理器正在堆叠我的事务,因此它在没有动画的情况下堆叠事务(悲伤但是真实),即使我在setCustomAnimations()之后提交事务,也会发生这种情况。

解决方案是首先设置动画:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.content, myFragment);
transaction.commit();

答案 1 :(得分:16)

如上所述,单独的陈述肯定会有效。但在设置交易类型即setCustomAnimationadd等之前,此处的技巧replace,否则它不会。因此,应用相同的逻辑,method chaining也有效。例如。

getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(R.anim.a_slide_up,
                             R.anim.a_slide_down,
                             R.anim.a_slide_up,
                             R.anim.a_slide_down)
        .add(R.id.root_layout, 
             MyFrag.newInstance())
        .addToBackStack("MyFrag")
        .commit();

将它放在这里,以便更喜欢method chaining的人发现它有用。干杯!

答案 2 :(得分:5)

将此留在这里,因为它是最受欢迎的问题。片段事务没有动画,我遇到了同样的问题。罪魁祸首是在包含的布局中将属性android:animateLayoutChanges设置为true

我希望它可以帮助别人节省一些时间寻找解决方案,因为在不同文件中嵌套布局时很难注意到。

答案 3 :(得分:0)

另一个原因可能是不必要地将fragmentTransaction.show()放在提交之前。这使得弹出转换无法在某些android API版本上显示。

答案 4 :(得分:0)

对我来说问题是使用 Fragment.getChildFragmentManager() 我切换到 Fragment.getParentFragmentManager() 并且动画突然开始工作。