web-dev-qa-db-ja.com

Android-フラグメントトランザクションのカスタムアニメーションが実行されていない

サポートパッケージ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>

誰もがここで何が起こっているか知っていますか?

76
adheus

マネージャーは、アニメーションを設定する前にトランザクションをスタックしていたため、アニメーションなしでトランザクションをスタックします(悲しいがtrue)。これは、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();
245
adheus

上記で提案したように、個別のステートメントは間違いなく機能します。しかし、ここでのトリックは、トランザクションタイプviz .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は、役に立ちました。乾杯!

18
Harisewak

これは最も一般的な質問なので、ここに残してください。フラグメントトランザクションがアニメーション化されないという同じ問題がありました。犯人は属​​性Android:animateLayoutChanges含まれるレイアウトでtrueに設定されます。

異なるファイルにネストされたレイアウトがあると気づきにくいため、誰かが解決策を探す時間を節約するのに役立つことを願っています。

5

別の理由は、コミットの前にfragmentTransaction.show()を不必要に配置することです。これにより、一部のAndroid APIバージョンでポップトランジションが表示されなくなります。

0