2012-06-14 9 views
67

Ich verwende Google API 8 (Android 2.2) mit Support-Paket v4.Android - Benutzerdefinierte Animation auf Fragment Transaktion nicht ausgeführt

Es gibt keinen Fehler oder Animation.

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?

+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 dir sagen. –

+6

Deshalb verwende ich das Support-Paket. – adheus

+0

[Benutzerdefinierte Animation in Android] (http://www.singhajit.com/android-custom-animations/) –

Antwort

212

Der Manager stapelte meine Transaktion, bevor ich die Animation setzte, also stapelt sie die Transaktion ohne Animationen (traurig aber wahr), und das tritt auf, selbst wenn ich die Transaktion nach der setCustomAnimations() festlege.

Die Lösung ist die Animationen setzen zuerst:

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

so müssen Sie die Anweisung teilen die Vermeidung der selbst zurückgegebenen Objekt Trick – sherpya

+0

@sherpya, was meinst du selbst zurückgegeben Objekttrick. – toobsco42

+4

'transaction.something(). Somethingselse(). Replace(). Commit()', viele von android Methoden geben 'this' zurück, so dass Sie vermeiden können, die Variable erneut zu tippen, aber irgendwie gibt es einen Nebeneffekt und' setCustomAnimations() ' sollte separat aufgerufen werden – sherpya

12

Wie oben angedeutet, werden separate Anweisungen auf jeden Fall funktionieren. Aber der Trick hier ist zu setCustomAnimation vor dem Setzen des Transaktionstyps viz. add, replace, usw., sonst nicht. Mit derselben Logik funktioniert auch method chaining. 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(); 

es hier Einlochen, so dass jemand, der method chaining findet es hilfreich vorzieht. Prost!

1

Lassen Sie dies hier, wie es die beliebteste Frage ist. Ich hatte das gleiche Problem, wenn die Fragmenttransaktion nicht animiert wurde. Der Täter war, dass das Attribut android:animateLayoutChanges im enthaltenden Layout auf true gesetzt war.

Ich hoffe, es hilft jemand sparen Sie einige Zeit auf der Suche nach einer Lösung, wie es schwer sein kann, wenn geschachtelte Layouts in verschiedenen Dateien zu bemerken.

Verwandte Themen