サポートパッケージ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>
誰もがここで何が起こっているか知っていますか?
マネージャーは、アニメーションを設定する前にトランザクションをスタックしていたため、アニメーションなしでトランザクションをスタックします(悲しいが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();
上記で提案したように、個別のステートメントは間違いなく機能します。しかし、ここでのトリックは、トランザクションタイプviz .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();
ここに置いて、method chaining
は、役に立ちました。乾杯!
これは最も一般的な質問なので、ここに残してください。フラグメントトランザクションがアニメーション化されないという同じ問題がありました。犯人は属性Android:animateLayoutChanges
含まれるレイアウトでtrue
に設定されます。
異なるファイルにネストされたレイアウトがあると気づきにくいため、誰かが解決策を探す時間を節約するのに役立つことを願っています。
別の理由は、コミットの前にfragmentTransaction.show()
を不必要に配置することです。これにより、一部のAndroid APIバージョンでポップトランジションが表示されなくなります。