Android - Benutzerdefinierte Animation bei Fragmenttransaktion läuft nicht

83

Ich verwende Google API 8 (Android 2.2) mit dem Support Package v4.

Es gibt keine Fehler oder Animationen.

Transaktion:

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

Animationen:

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>

Weiß jemand, was hier passiert?

Adheus
quelle
1
Fragmente wurden erst mit Honeycomb (API 11, Android 3.0) eingeführt. Das könnte das Problem sein, aber ich hätte gedacht, Eclipse würde es Ihnen sagen.
Steve Blackwell
6
Deshalb verwende ich das Support-Paket.
Adheus

Antworten:

256

Der Manager hat meine Transaktion gestapelt, bevor ich die Animation festgelegt habe, sodass die Transaktion ohne Animationen gestapelt wird (traurig, aber wahr). Dies tritt auch dann auf, wenn ich die Transaktion nach dem festschreibe setCustomAnimations().

Die Lösung besteht darin, zuerst die Animationen festzulegen:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.content, myFragment);
transaction.commit();
Adheus
quelle
Sie müssen also die Anweisung aufteilen, um den Trick des selbst zurückgegebenen Objekts zu vermeiden
sherpya
4
transaction.something().somethingelse().replace().commit()Viele Android-Methoden kehren zurück, thisso dass Sie vermeiden können, die Variable erneut einzugeben, aber hier tritt irgendwie ein Nebeneffekt auf und setCustomAnimations()sollte separat aufgerufen werden
sherpya
43
Zu beachten ist, dass "selbst zurückgegebener Objekttrick" als "Methodenverkettung" bezeichnet wird
Egor
Die Verkettung der Methode mit dem obigen Aufruf funktioniert definitiv. Habe es gerade in meinem eigenen Projekt getestet.
MawrCoffeePls
Verwenden Sie transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);stattdessen zusätzlich, um das Fragment beim Pop vom Backstack zu animieren .
Justin
23

Wie oben vorgeschlagen, funktionieren separate Anweisungen definitiv. Der Trick dabei ist jedoch, setCustomAnimationvor dem Festlegen des Transaktionstyps nämlich. add, replaceEs tut etc. sonst nicht. Die gleiche Logik anzuwenden method chainingfunktioniert also auch. z.B.

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

Setzen Sie es hier, damit jemand, der es vorzieht method chaining, es hilfreich findet. Prost!

Harisewak
quelle
1
Ich bin leicht beleidigt darüber, wie Sie den Punktoperator für die Methodenverkettung verwenden.
Shaishav
1
Einverstanden @Shaishav, schrieb diese Antwort vor zwei Jahren und aktualisierte sie .. Danke!
Harisewak
6

Lassen Sie dies hier als die beliebteste Frage. Ich hatte das gleiche Problem mit nicht animierten Fragmenttransaktionen. Schuld daran wurde mit dem android:animateLayoutChangesAttributsatz truein dem Layout enthalten.

Ich hoffe, es hilft jemandem, Zeit bei der Suche nach einer Lösung zu sparen, da es schwer zu bemerken sein kann, wenn Layouts in verschiedenen Dateien verschachtelt sind.

Màrius Mora Bosch
quelle
0

Ein weiterer Grund kann das unnötige Platzieren fragmentTransaction.show()vor dem Festschreiben sein. Dies führt dazu, dass Pop-Übergänge in einigen Android-API-Versionen nicht angezeigt werden.

Carson Holzheimer
quelle