'IllegalStateException: - Aktivität wurde zerstört' wenn 'getSupportFragmentManager ()', genannt nach der Aktivität neu starten
Habe ich eine Eltern-Fragment-Aktivität, die einen ViewPager enthält ein Kind ViewPager. Das Kind ViewPager enthält Fragmente für jede Seite. Ich kommuniziere zwischen diesen untergeordneten Seite-Fragmente und die top-parent-Fragment Tätigkeit mit einem callback-interface z.B.
public interface Callbacks {
public void onItemSelected(Link link);
}
In der Eltern-Fragment-Aktivität höre ich für onItemSelected
Veranstaltungen z.B.
@Override
public void onItemSelected(Link link) {
Bundle argumentsFront = new Bundle();
argumentsFront.putParcelable(FragmentComments.ARG_ITEM_ID, link);
fragmentComments = new FragmentComments();
fragmentComments.setArguments(argumentsFront);
getSupportFragmentManager().beginTransaction().replace(R.id.post_container, fragmentComments).commitAllowingStateLoss();
}
Nun, dies funktioniert gut, wenn die app zum ersten mal gestartet wird.
Wenn Sie schalten Sie das Gerät zur Veränderung der Ausrichtung der Aktivität neu gestartet. Alle Fragmente, reinitialisiert sich selbst habe, da ich setRetainInstance(true);
(ich nicht nennen, setRetainInstance(true) auf der Seite Fragmente des Kindes ViewPager, da es nicht unterstützt). Jedoch wenn ich auf ein Listenelement in das Fragment des Kindes ViewPager bekomme ich diese exception:
FATAL EXCEPTION: main
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
Weiß jemand, warum dies passiert?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie das Gerät drehen, Android speichert, zerstört und erschafft Ihre
Activity
und seineViewPager
vonFragments
. Da dieViewPager
verwendet dieFragmentManager
IhrerActivity
, speichert und verwendet dieseFragments
für Sie (und nicht neue zu schaffen), so dass Sie Sie halten die alten Verweise auf deine (jetzt zerstört) originalActivity
, und Sie bekommen, dassIllegalStateException
.In Ihrem Kind
Fragments
, probieren Sie etwas wie dieses:Dann, sobald eine Auswahl erfolgt:
Seit
onAttach
aufgerufen wird, wird als Teil derFragment
Lebenszyklus, IhreFragments
aktualisieren Ihren Rückruf Verweis auf rotation.onAttach
Methode, die schon aussieht wie die, die Sie zur Verfügung gestellt. Auf die Ausrichtung ändern, meineonAttach
Methode wird nicht einmal aufgerufen und als Ergebnis meine callback wird nicht aktualisiert. Die Eltern FragmentsetRetainInstance(true)
ich denke, dies verhindert, dass das Kind-Fragment losgelöst zu sein?onAttach
sollte noch werden immer aufgerufen, auch wennsetRetainInstance(true)
gesetzt ist, also etwas anderes werden können, läuft hier falsch. Könnten Sie die post mehr von deinem code, um die Einstellung und aufrufen der callback? Schauen Sie sich auch die Antwort auf diese Frage, mitsetRetainInstance(true)
ist nicht eine gute Praxis in diesem Fall sollten Sie das speichern und wiederherstellen des Status - stackoverflow.com/questions/11182180/...onItemSelected
Methode in der ViewPager-Kind-Fragmente, die an die callback-in der Eltern-Fragment (Fragment 1). Dies scheint ein bisschen wie ein hack, aber funktioniert gut. Ich benutzesetRetainInstance(true)
im Fragment 1 so, dass der Kind-Fragmente behalten Staat zu.Fragment
ruft zurück zu seinen ElternFragment
. Ich habe den gleichen code wie oben in onAttach, aber anstelle der ElternActivity
auf meinen Rückruf, ich gegossengetParentFragment()
um einen ref zu der übergeordnetenFragment
wer implementiert die callback. Vielleicht könnte helfen, eine sauberere Lösung, aber froh, dass du so oder so.Ich hatte ein ähnliches Problem, ich denke, es ist, weil die Fragmente bleiben erhalten und halten eine Referenz auf eine destoryed-Aktivität, war meine Lösung zu halten, einen Verweis auf das fragment in der Aktivität e.g-Fragment myfragment = null. Und dann verwenden Sie den folgenden code in MyFragment:
Hatte ein ähnliches Problem. Im Grunde, wenn der ViewPager hat nur ein paar Fragmente, dann Verweise speichern, um Sie in die aktuelle Aktivität. Rufen Sie NICHT pagerAdapter die getItem () - denn es entsteht ein neues fragment, und es ist nicht an jeder Aktivität und das ist der Grund, warum wir "Activity wurde zerstört" Ausnahme. Wenn Sie nicht wollen, zu halten fragment Verweise, dann können Sie findViewWithTag () - Methode auf, um Fragment-Objekt.
Begehen Transaktionen in OnPostResume Rückruf behoben das Problem für mich. Dank der folgenden blogpost
http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
Ich hatte dieses problem mit verschachtelten Fragmente und keine der stackoverflow-Lösungen, die für mich gearbeitet. Nur scheint es, dass es einen Fehler mit Unterstützung der Bibliothek, wenn Sie entlassen Fragmente noch speichern Zeiger auf vorherigen Aktivität (so getFragmentManager() nur null zurück, da er aufgerufen wird, auf bereits zerstörte Aktivität), das ist, warum Sie brauchen, um zu verwalten Zeiger selbst. Ich landete mit folgender Lösung:
1. In der ersten Ebene fragment ich wurde speichern Zeiger auf die Aktivität in der Methode
2. In der Aktivität, die Griffe Fragmente landete ich mit diesem code:
Sollten Sie pass parentActivity der ERSTEN Ebene fragment nur beim aufrufen der ZWEITEN Ebene (geschachtelte) - Fragmente, wie es scheint, dass dieser bug ist nur mit verschachtelten diejenigen, die nach Ihnen, bringen Sie Ihre app von Vordergrund zu stellen.