Was passiert genau, wenn Android meine App bei einer Änderung der Ausrichtung mit verschachtelten Fragmenten und getSupportFragmentManager () neu erstellt?

Ich habe mir andere Threads angesehen, die sich auf dieses Problem beziehen, und alle scheinen getChildFragmentManager () zu verwenden, aber wenn möglich, würde ich gerne getSupportFragmentManager () verwenden.

Hier ist das Problem: Ich habe Elternfragment A, das Kindfragment B enthält. B ist ein Selektorfragment. Wenn der Benutzer eine Auswahl trifft, wird B durch C "ersetzt". Jetzt hält A also C. Der Benutzer kann auch zu B zurückkehren und ein C öffnen, das einige andere Daten anzeigt. Wir nennen es C '. Wenn der Benutzer zurückgeht, handelt es sich um eine "Ersetzen" -Transaktion (nicht um einen Backstack). Außerdem sind C und C 'unterschiedliche Instanzen derselben Fragmentklasse.

Dies funktioniert größtenteils, aber ich habe ein Szenario gefunden, das zu abnormalem Verhalten führt.

Benutzer startet im Hochformat, B zeigt @

Benutzer im Hochformat, wählt C

User wechselt ins Querformat

Benutzer im Querformat zeigt C @

Benutzer wechselt zurück zum Hochformat

Benutzer im Hochformat zeigt C @

Benutzer im Porträt, kehrt zu B @ zurü

User in protrait, wählt C '

User wechselt ins Querformat

Benutzer im Querformat zeigt C '@

Benutzer wechselt zurück zum Hochformat

Benutzer im Porträt, B zeigt @ Huh?!

At # 12, C 'sollte immer noch angezeigt werden, nicht B (das Selektorfragment). Warum hat Android sich nicht an C 'hier erinnert?Was passiert genau, wenn Android meine App bei einer Änderung der Ausrichtung mit verschachtelten Fragmenten und getSupportFragmentManager () neu erstellt?

Ich bin der Meinung, dass dies möglicherweise etwas mit dem Unterschied zwischen der Referenzierung eines von getSupportFragmentManager () verwalteten Fragments mit einer Container-ID und einem Tag zu tun hat. Wenn ich eine Container-ID verwende, wird dies möglicherweise durch Ausrichtungsänderungen beeinträchtigt, da XML-Dateien ausgetauscht werden (obwohl sich der Name der Container-ID nicht ändert). Hoffentlich macht das Sinn. Ich verwende übrigens Container-IDs.

Einige andere Hintergrundinformationen: In dieser speziellen Situation verwende ich den Backstack überhaupt nicht. Wenn ich Fragmente ändere, verwende ich "Ersetzen" -Transaktionen und das "neue" reservierte Wort und erstelle ein neues verschachteltes Fragment.

Auch hier ist ein Bild, mit dem Sie besser verstehen können, was A, B, C, C 'ist:

Antworten auf die Frage(2)

Ihre Antwort auf die Frage