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


83

サポートパッケージv4でGoogleAPI 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が教えてくれると思いました。
スティーブブラックウェル2012年

6
そのため、サポートパッケージを使用しています。
adheus 2012年

回答:


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()するため、個別に
呼び出す

44
ちなみに、「自己戻りオブジェクトトリック」は「メソッドチェーン」と呼ばれます
Egor 2014

上記の呼び出しを連鎖させるメソッドは間違いなく機能します。自分のプロジェクトでテストしたところです。
mawrCoffeePls 2015年

さらに、バックスタックからポップするときにフラグメントをアニメーション化するには、transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);代わりにを使用します。
ジャスティン2015年

23

上で示唆したように、別々のステートメントは間違いなく機能します。ただし、ここでの秘訣は、setCustomAnimationトランザクションタイプを設定する前です。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に同意し、2年前にこの回答を書き、更新しました。ありがとう!
ハリセワク

7

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

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


アニメーションは現在機能していますが、新しい問題があります。アニメーションの動作が変更されています。水平方向にスライドする前(予想どおり)。コーナーから拡大中
Sharad Kale

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.