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


83

我正在使用带有支持包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>

有人知道这里发生了什么吗?


1
直到Honeycomb(API 11,Android 3.0)才引入片段。可能是问题所在,但我以为Eclipse会告诉您。
史蒂夫·布莱克威尔

6
这就是为什么我使用支持包。
adheus 2012年

Answers:


256

经理在设置动画之前就在堆叠我的事务,因此它在没有动画的情况下堆叠了事务(悲伤但为真),即使我在之后提交事务,也会发生这种情况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();

因此,您必须拆分语句以避免自我返回对象的欺骗
sherpya 2013年

4
transaction.something().somethingelse().replace().commit(),许多android方法都会返回,this因此您可以避免重新输入变量,但不知何故这里暴露出副作用,setCustomAnimations()应单独调用
sherpya 2013年

44
只是要注意,“自我返回对象的把戏”被称为“方法链接”
Egor

上面调用的方法链接绝对有效。刚刚在我自己的项目中对其进行了测试。
MawrCoffeePls,2015年

另外,要动画从后堆栈弹出时的片段,请transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);改用。
贾斯丁

23

如上所述,单独的语句肯定会起作用。但是,这里技巧setCustomAnimation在设置事务类型viz之前。addreplace等等,否则没有。因此,应用相同的逻辑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发现它有帮助。干杯!


1
我对使用“点”运算符进行方法链接的方式感到不高兴。
Shaishav

1
同意@Shaishav,两年前写下了这个答案,并对其进行了更新..谢谢!
Harisewak

7

将此保留为最受欢迎的问题。我对片段交易没有设置动画有同样的问题。罪魁祸首是在包含布局中将属性android:animateLayoutChanges设置为true

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


动画现在可以工作,但是存在新问题-它改变了动画行为。在水平滑动之前(如预期的那样)。现在从角落扩展
沙拉德·羽衣甘蓝

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.