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

adh*_*eus 78 android android-animation android-fragments

我正在使用支持包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();
Run Code Online (Sandbox Code Playgroud)

动画:

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

adh*_*eus 248

在设置动画之前,管理器正在堆叠我的事务,因此它在没有动画的情况下堆叠事务(悲伤但是真实),即使我在事务之后提交了事务,也会发生这种情况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();
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,"自我归还对象技巧"被称为"方法链接" (42认同)
  • `transaction.something().somethingelse().replace().commit()`,许多android方法返回`this`所以你可以避免重新输入变量,但不知怎的,这里暴露了副作用和`setCustomAnimations()`应该分开叫 (4认同)

Har*_*wak 19

如上所述,单独的陈述肯定会奏效.但这里诀窍setCustomAnimation在设置事务类型之前.add,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();
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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