Android - Custom Animation on fragment transaction

2019-01-21 05:20发布

I'm using Google API 8 (Android 2.2) with support package v4.

It doesn't give any error or animation.

Transaction:

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

Animations:

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>

Does anyone know what is happening here?

4条回答
smile是对你的礼貌
2楼-- · 2019-01-21 05:43

As suggested above, separate statements will definitely work. But the trick here is to setCustomAnimation before setting transaction type viz.add, replace, etc. else it doesn't. So, applying the same logic, method chaining also works. eg.

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();

Putting it here, so that someone who prefers method chaining finds it helpful. Cheers!

查看更多
我想做一个坏孩纸
3楼-- · 2019-01-21 05:55

The manager was stacking my transaction before I set the animation, so it stacks the transaction without animations (sad but true), and that occurs even if I commit the transaction after the setCustomAnimations().

The solution is to set the animations first:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.content, myFragment);
transaction.commit();
查看更多
▲ chillily
4楼-- · 2019-01-21 06:01

Another reason can be unnecessarily placing fragmentTransaction.show() before commit. This makes pop transitions not show on some android API versions.

查看更多
别忘想泡老子
5楼-- · 2019-01-21 06:03

Leaving this here as it's the most popular question. I had the same problem with fragment transaction not animating. The culprit was having the attribute android:animateLayoutChanges set to true in the containing layout.

I hope it helps someone save some time looking for a solution as it can be hard to notice when having nested layouts in different files.

查看更多
登录 后发表回答