Verschachtelte Fragmente verschwinden beim übergang animation

Hier ist das Szenario: Aktivität beinhaltet fragment A, die wiederum verwendet getChildFragmentManager() hinzufügen Fragmente A1 und A2 in seiner onCreate etwa so:

getChildFragmentManager()
  .beginTransaction()
  .replace(R.id.fragmentOneHolder, new FragmentA1())
  .replace(R.id.fragmentTwoHolder, new FragmentA2())
  .commit()

So weit, So gut, alles läuft wie erwartet.

Wir dann führen Sie die folgende Transaktion in der Aktivität:

getSupportFragmentManager()
  .beginTransaction()
  .setCustomAnimations(anim1, anim2, anim1, anim2)
  .replace(R.id.fragmentHolder, new FragmentB())
  .addToBackStack(null)
  .commit()

Während des übergangs, die enter Animationen für fragment B läuft korrekt, aber Fragmente A1 und A2 ganz verschwinden. Wenn wir das zurücksetzen der Transaktion mit der Zurück-Taste, Sie richtig initialisieren und anzeigen, die normalerweise während der popEnter animation.

In meinem kurzen Test, es wurde seltsamer - wenn ich die Animationen für die Kind-Fragmente (siehe unten), die exit animation ausgeführt wird, periodisch, wenn wir hinzufügen fragment B

getChildFragmentManager()
  .beginTransaction()
  .setCustomAnimations(enter, exit)
  .replace(R.id.fragmentOneHolder, new FragmentA1())
  .replace(R.id.fragmentTwoHolder, new FragmentA2())
  .commit()

Den Effekt, den ich erzielen will ist einfach, ich möchte die exit (oder sollte es sein popExit?) animation auf fragment A (anim2) zu laufen, zu animieren, das ganze Behältnis, einschließlich seiner verschachtelten Kinder.

Gibt es irgendeine Möglichkeit das zu erreichen?

Bearbeiten: Bitte suchen Sie einen Testfall hier

Edit2: Dank @StevenByle für schob mich, es weiter zu versuchen mit der statischen Animationen. Anscheinend kann man Animationen auf ein pro-op-basis (nicht global für die ganze Transaktion), das heißt, die Kinder haben, können eine unbestimmte statische animation gesetzt, während Ihre Eltern können eine andere animation und die ganze Sache verpflichtet werden können in einer Transaktion. Siehe die Diskussion unten und die aktualisierte test-Fall-Projekt.

Was ist R.id.fragmentHolder mit Bezug auf A, A1, A2, etc?
fragmentHolder ist eine id, die in der Aktivität layout, fragment{Eins,Zwei} - Halter in Ein fragment-layout. Alle drei sind Verschieden. Fragment A wurde zunächst Hinzugefügt fragmentHolder (ich. e., fragment B ist das ersetzen von fragment A).
Erstellt habe ich ein Beispiel-Projekt hier: github.com/BurntBrunch/NestedFragmentsAnimationsTest , es gibt auch eine apk enthalten, in das repository. Dies ist eine wirklich lästige Fehler und ich bin auf der Suche nach einem Weg, das zu umgehen (vorausgesetzt, dass es nicht in meinem code).
Ich weiß ein bisschen mehr über dieses Thema. Der Grund, warum die Fragmente verschwinden ist, weil die Kinder, Griff die Lebenszyklus-Ereignisse vor den Eltern. Im wesentlichen, A1 und A2 entfernt werden, bevor Ein und, da Sie nicht über Animationen eingestellt, verschwinden Sie schlagartig. Ein Weg, um etwas abzumildern, ist dies explizit zu entfernen, A1 und A2 in der Transaktion, ersetzt die A., Die Art und Weise, Sie zu animieren, wenn Sie verlassen, aber Ihre animation Geschwindigkeit im Quadrat, da der übergeordnete container ist auch animierend. Eine Lösung, die nicht produzieren, dieses Artefakt würde geschätzt werden.
Die änderung(ersetzen des starter-fragment), die Sie erwähnen, in der Frage ist die richtige, die Sie wollen zu tun, oder ist es nur ein Beispiel? Sie rufen die changeFragment Methode nur ein einziges mal?

InformationsquelleAutor Delyan | 2013-02-15

Schreibe einen Kommentar