2017-06-08 6 views
2

Ich lerne, wie man eine "single activity - multiple fragments" -Architektur implementiert. Es ist heutzutage weit verbreitet, wie ich es verstehe, und Sie können eine Menge Artikel zu diesem Thema finden. Zum Beispiel dieses http://vinsol.com/blog/2014/09/15/advocating-fragment-oriented-applications-in-android/.Fragment orientierte Architektur und der Backstack

Es gibt zwei Arten von Fragmenten in einer solchen Architektur - Eltern und Kind aus meiner Sicht.

Das übergeordnete Fragment wird von der obersten Ebene gestartet, z. B. aus einer Schublade. Ich ziehe es in der folgenden Art und Weise zu tun:

public void startParent(Fragment fragment) { 
    manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment); 
    transaction.addToBackStack(fragment.getClass().getCanonicalName()); 
    transaction.commit();  
} 

Auch gibt Kindfragment ist, die wie folgt gestartet:

public void startChild(Fragment fragment) { 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment); 
    transaction.addToBackStack(fragment.getClass().getCanonicalName()); 
    transaction.commit(); 
} 

In beiden Fällen sind die manager ist Standard-Fragment-Manager von Aktivität zur Verfügung gestellt. Es gibt nur einen Unterschied zwischen den bereitgestellten Methoden. Im ersten Fall wird der Rückstapel gelöscht, um das neue Fragment von Grund auf neu zu starten. Auf der ersten Sekunde hat es nur auf den hinteren Stapel geschoben.

Als Ergebnis zurück Stapel kann wie folgt aussehen: Eltern -> Child1 -> Child2

Ein Benutzer zwischen den Fragmenten navigiert oder starten Sie einfach die neue Sequenz von der obersten Ebene (Schublade).

Wenn ein Benutzer die Taste zurückdrückt, wird das letzte Fragment vom Stapel zurückgeholt. Wie ich verstehe, müssen Sie nicht onBackPressed() Methode der Aktivität außer Kraft setzen.

Es funktioniert gut, bis Bildschirmkonfiguration geändert wird. Wenn Bildschirmkonfiguration onBackPressed() führt zu bekannten Fehler java.lang.IllegalStateException geändert wird: Kann diese Aktion nach onSaveInstanceState nicht durchführen

Es gibt haben viele Fragen bereits zu diesem Thema auf Stackoverflow gefragt worden, aber ich didn‘ Ich finde die richtige Antwort für meinen Fall. Leute schlagen vor, commitAllowingStateLoss() und so weiter zu nennen, aber es ist mit meinem Fall nicht verbunden. Ich möchte kein neues Fragment starten Ich möchte nur zum vorherigen zurückkehren.

Also meine Frage ist folgende: Ist mein Verständnis richtig, dass es keine Möglichkeit gibt, nach Änderung der Bildschirmkonfiguration zurück durch den Backstack zu navigieren? Alles, was Sie tun müssen, ist es ungültig zu machen und von vorne anzufangen?

Antwort

0

Eine solche Ausnahme tritt auf, wenn Sie versuchen, Aktivität des ein Fragment Übergang nach dem Fragment onSaveInstanceState auszuführen() aufgerufen wird.

Nachdem die Konfiguration geändert wurde, ruft das System die Aktivität für Ressourcen erneut auf und erstellt sie später neu. Daher wird Fragment nicht erstellt und java.lang.IllegalStateException wird angezeigt.

Referenz: - getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState"

+0

Vielen Dank für Referenz, aber ich habe es schon gelesen. Es beantwortet meine Frage nicht. Ich begehe keine Transaktionen innerhalb der Aktivitätslebenszyklus-Methoden. Außerdem bin ich nicht bereit, die Methode 'onSaveInstanceState' in meine Aktivität zu übernehmen. Problem ist, dass es keine 'popBackStackAllowingStateLoss' Methode gibt. –

Verwandte Themen