Animierende Fragmente und den Backstack

Lesezeit: 4 Minuten

Benutzer-Avatar
Kelly Merell

Ich habe Probleme beim Verwenden oder Verstehen, wie das Entfernen von FragmentTransactions aus dem Backstack die benutzerdefinierten Animationen handhabt. Insbesondere erwarte ich, dass es die “out” -Animation aufruft, aber es scheint nicht so zu sein.

Ich habe eine einfache Methode, um eine Fragmenttransaktion (FragmentTransaction) zu handhaben, bei der ich ein Fragment hinzufüge und einen benutzerdefinierten Übergang anwende, damit es ein-/ausgeblendet wird. Ich füge dies auch dem Backstack hinzu, damit der Benutzer diese Transaktion mit der Zurück-Schaltfläche rückgängig machen kann und im Wesentlichen zu dem Zustand navigiert, bevor das Fragment hinzugefügt wurde.

protected void changeFragment() { 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    ft.add(R.id.fragment_container, new TestFragment()); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

Alles funktioniert großartig, wenn man sich vorwärts bewegt, aber wenn der Benutzer auf die Schaltfläche „Zurück“ klickt, werden die Übergangsanimationen nicht umgekehrt. Ich hatte erwartet, dass beim Entfernen des Fragments die Ausblendanimation verwendet wird. Stattdessen scheint es herauszuspringen (ohne Animation) und dann scheint der Container einzublenden. Ich bin mir nicht sicher, ob genau das passiert, aber das Fragment wird definitiv nicht ausgeblendet.

Meine Anwendung verwendet die Kompatibilitätsbibliothek, um Fragmentunterstützung hinzuzufügen, aber ich gehe davon aus, dass dies auch für Honeycomb (Android-11) gilt. Weiß jemand, ob ich hier nur etwas falsch mache oder ob ich einfach zu viel erwarte? Idealerweise möchte ich die Fragmente ähnlich wie Gmail (auf dem Xoom) animieren, um vorwärts zu gehen, indem ich auf eine Nachricht klicke, und dann zurück, indem ich die Zurück-Schaltfläche verwende. Vorzugsweise muss ich die Zurück-Schaltfläche nicht überschreiben und mit meinem eigenen Fragmentzustand Schritt halten, da ich mehrere “Transaktionen” haben könnte, aus denen ich mich zurückziehen möchte, und ich bin kein Fan davon, Räder neu zu erfinden.

Auch in der Android Developers Group gefragt: http://groups.google.com/group/android-developers/browse_thread/thread/1136a3a70fa0b6e9

  • Ich bin auch auf dieses Problem gestoßen und habe hier einen Fehlerbericht eingereicht code.google.com/p/android/issues/…

    – Damian

    20. März 2011 um 0:35 Uhr

  • Bitte markieren Sie den obigen Fehlerbericht.

    – Damian

    20. März 2011 um 0:36 Uhr

  • Markiert. Danke, dass du das als Boog eingereicht hast. Ich wollte mir vorher noch mal ein Bild davon machen.

    – Kelly Merrell

    22. März 2011 um 22:25 Uhr

  • … und der Fehler wurde behoben. Der Fix kam für die Version 3.1 zu spät; es wird in einer kommenden Version enthalten sein.

    – Chet Haase

    20. Mai 2011 um 3:16 Uhr

  • @Chet: Könnten Sie bitte die Details des Fixes als Antwort posten, damit wir dies von der Liste der unbeantworteten Antworten streichen können? Vielen Dank.

    – Bill die Eidechse

    24. Juni 2011 um 20:59 Uhr

Ich benutze das:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out);

und die Übergänge funktionieren umgekehrt, wenn die Zurück-Taste gedrückt wird.

  • Sie, mein Herr, sind ein Gott unter den Menschen.

    – Cruceo

    10. Januar 2014 um 20:15 Uhr

  • das war eine einfache lösung

    – Hamzeh Soboh

    2. März 2015 um 15:19 Uhr

Der Fehler wurde in Version 3.2 durch Hinzufügen der folgenden neuen API behoben:

http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int)

Es ist zu beachten, dass es noch nicht in die Kompatibilitätsbibliothek zurückportiert wurde (wie im Fehlerbericht erwähnt).

  • Die neueste Version der Kompatibilitätsbibliothek (r4) enthält jetzt diesen Fix.

    – Blazeroni

    22. Oktober 2011 um 2:19 Uhr

  • Ich verwende die neueste Version der Kompatibilitätsbibliothek, aber wenn ich versuche, diese aufzurufen, erhalte ich die Ausnahme „Unbekannter Animationsname: objectAnimator“.

    – powerj1984

    12. Dezember 2011 um 16:32 Uhr

  • Mit Unterstützung können Sie nur Animationen in XML verwenden, die alte Methode, nicht den Objektanimator.

    – Snikola

    6. März 2013 um 16:35 Uhr

Es ist ein Fehler, schau dir das an Fehlerbericht 15623. Einer der Android-Projektmitglieder kommentierte, dass der Fix für Version 3.1 zu spät sei, aber es in die nächste Version schaffen sollte.

Dasselbe Mitglied sagt weiter, dass …

Das Problem besteht darin, dass bei einer Pop-Operation dieselben Animationen ausgeführt werden, die ausgeführt wurden, um die Fragmente an ihren aktuellen Stellen zu platzieren. Zum Beispiel schieben wir im obigen Gleitbeispiel bei einer Vorwärtsoperation (Schieben des alten Fragments auf den Stapel und Bewegen des neuen Fragments ins Sichtfeld) das alte Fragment aus der Mitte heraus nach links und schieben das neue Fragment von der direkt ins Zentrum. Wenn der Stapel geöffnet wird, werden dieselben Animationen ausgeführt: Das neueste Fragment wird „heraus“ animiert, indem es von rechts in die Mitte geschoben wird (danach verschwindet es, da es entfernt wird). Das alte Fragment wird vom Stapel abgehoben und von der Mitte nach links animiert … direkt vom Bildschirm.

1145860cookie-checkAnimierende Fragmente und den Backstack

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy