IllegalStateException: Fragment bereits im Tabhost-Fragment hinzugefügt
Lesezeit: 7 Minuten
Benutzer782104
FATAL EXCEPTION: main
Process: com.example.loan, PID: 24169
java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form}
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533)
at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
at dalvik.system.NativeStart.main(Native Method)
Ich habe also eine Android-App, die mit dem Tabhost erstellt wird. Es gibt insgesamt drei Registerkarten, in tab2 gibt es eine Schaltfläche, um die Fragmenttransaktion in tab2 durchzuführen (die die Funktion in der Fragmentaktivität aufruft).
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commit();
Es gibt eine Ausnahme, wenn ich so laufe:
Innerhalb von tab2 drücke ich die Taste, um das Fragment zu ändern
Wechseln Sie zu einem anderen Tab (z. B. Tab 1 oder Tab 3)
Zurück-Taste drücken
Ausnahme auslösen
Wie kann man das beheben? Danke fürs Helfen
mögliches Duplikat von IllegalStateException: Bereits hinzugefügtes Fragment erscheint, wenn eine App sehr lange im Hintergrund war
– fweigl
19. September 2014 um 4:36 Uhr
das bedeutet, dass die Backpress ein neues Fragment hinzufügt, was ist die Logik im Backstack? Danke vielmals
– Benutzer782104
19. September 2014 um 4:37 Uhr
wird mFrag neben tab2 auch zu einer anderen Registerkarte hinzugefügt?
– Achil
19. September 2014 um 6:29 Uhr
Ujju
Dies passiert, wenn wir versuchen, dasselbe Fragment oder DialogFragment zweimal hinzuzufügen, bevor wir es verwerfen.
Ruf einfach an
if(mFragment.isAdded())
{
return; //or return false/true, based on where you are calling from
}
Allerdings sehe ich keinen Grund, das alte Fragment zu entfernen und dasselbe Fragment erneut hinzuzufügen, da wir die Benutzeroberfläche/Daten aktualisieren können, indem wir einfach Parameter an die Methode innerhalb des Fragments übergeben
Dies sollte die akzeptierte Antwort sein. Die akzeptierte Antwort ergibt keinen Sinn. Erstens sollte es keine Verneinung von geben isAdded(). Zweitens wird in den Kommentaren vorgeschlagen, dass dieser Code eingefügt wird onCreate(), was auch unsinnig ist. Diese Codezeile sollte direkt vor der Zeile platziert werden, in der das Fragment hinzugefügt (oder ersetzt) wird, nicht in onCreate() oder onCreateView(). Es ist zu spät, diesen Code in einer dieser Methoden auszuführen.
muss auch auf versteckte Fragmente überprüft werden.
– Mahdi Moqadasi
31. März 2019 um 10:10 Uhr
Ich muss ähnliche Fragmente hinzufügen und nur die Attribute im Fragment sind unterschiedlich. Aber doppelter Fehler tritt immer noch auf.
– Alston
7. September 2019 um 10:29 Uhr
Ich hatte bereits implementiert, um zu prüfen, ob das Fragment bereits hinzugefügt wurde, und dann zurückzugeben (der Code zum Hinzufügen von Fragmenten wird nicht ausgeführt). Alle Geräte, die ich versuche, es vor einem Monat herauszufinden, ich kann es nicht überwinden, ich hatte eine Reihe von Lösungen angewendet und den Build im Live Play Store aktualisiert, trotzdem erhalte ich den Fehler von einigen der Geräte wie Galaxy S20 + 5G, Huawei, es gibt weniger Geräte, die das Problem haben, das ich habe, jede Hilfe wäre dankbar, danke
– Navin
9. Juli 2020 um 6:19 Uhr
Entfernen Sie das alte Fragment, falls es noch hinzugefügt wird, und fügen Sie dann das neue Fragment hinzu:
FragmentManager fm = getSupportFragmentManager();
Fragment oldFragment = fm.findFragmentByTag("fragment_tag");
if (oldFragment != null) {
fm.beginTransaction().remove(oldFragment).commit();
}
MyFragment newFragment = new MyFragment();
fm.beginTransaction().add(newFragment , "fragment_tag");
Sollten wir nicht Argumente senden, um Änderungen an dem bereits angezeigten Fragment vorzunehmen? anstatt sie zu entfernen und erneut hinzuzufügen
– Ujju
28. Mai 2018 um 7:32 Uhr
Sie können die Argumente nicht festlegen, nachdem das Fragment zum Fragment-Manager hinzugefügt wurde. Aus docs: “Diese Methode kann nicht aufgerufen werden, wenn das Fragment zu einem FragmentManager hinzugefügt wird und wenn isStateSaved() true zurückgeben würde.” Sie müssen also Ihre Fragmentmethoden direkt aufrufen, wenn Sie die Benutzeroberfläche aktualisieren möchten.
– vovahost
28. Mai 2018 um 11:40 Uhr
Ja, ich meinte nicht die Einstellung über setArgumentsbezog sich auf das Senden von Argumenten als zu aktualisierende Parameter, also hat das Entfernen und Hinzufügen desselben Fragments keinen Nutzen, oder?
– Ujju
28. Mai 2018 um 11:49 Uhr
Es hängt davon ab, ob. Wenn Sie viele Dinge neu konfigurieren müssen, ist es möglicherweise einfacher, das Fragment einfach durch ein neues zu ersetzen. Es hängt alles von Ihren Bedürfnissen ab.
– vovahost
28. Mai 2018 um 13:08 Uhr
Ich erhalte weiterhin den Fehler, wenn ich eine Transaktion verwende. Wahrscheinlich liegt dies am asynchronen Verhalten der Arbeit mit dem Fragmentmanager.
– CoolMind
1. Juli 2019 um 9:28 Uhr
Sie müssen nur eine Bedingung in Ihrem unten genannten Fragment überprüfen:
if(!isAdded())
{
return;
}
isAdded = Gibt wahr zurück, wenn das Fragment derzeit zu seiner Aktivität hinzugefügt wird. Entnommen aus dem offiziellen Dokument. Dadurch wird dieses Fragment nicht hinzugefügt, wenn es bereits hinzugefügt wurde
danke für deine Hilfe, meinst du, ich habe das if(!isAdded()) in oncreateview eingefügt?
– Benutzer782104
19. September 2014 um 5:48 Uhr
Ja, Sie müssen nur den Code einfügen, den ich in meiner obigen Antwort erwähnt habe … Das bedeutet, dass Ihr Fragment bereits im Stapel hinzugefügt wurde. Es ist also nicht erforderlich, es erneut hinzuzufügen, und es kehrt einfach zurück.
– Tiefe Mehta
19. September 2014 um 19:08 Uhr
Das macht keinen Sinn, Sie können void in onCreateView nicht zurückgeben, meinten Sie onCreate? Ich habe das dort ausprobiert und es hat meinem Problem nicht geholfen
– Fonix
19. Januar 2015 um 2:34 Uhr
Kommt das hinzu onCreate?
– StuStirling
13. Februar 2015 um 16:36 Uhr
Warum das Negationszeichen? Sollte das Fragment nicht hinzugefügt werden, wenn !isAdded() ?
– Alen Siljak
18. August 2015 um 8:56 Uhr
Manchmal passiert es, dass die richtige ID aus dem jeweiligen Layout nicht gefunden wird. Ich stand vor diesem Problem. Dann stellte ich nach vielen Stunden fest, dass ich die falsche Recyclerview-ID eingestellt hatte. Ich ändere es, und es funktioniert gut für mich.
Überprüfen Sie also Ihr Fragment-Layout.
Sie müssen nur eine Bedingung überprüfen, bevor Sie die Fragmenttransaktion starten
if (!fragmentOne.isAdded()){
transaction = manager.beginTransaction();
transaction.add(R.id.group,fragmentOne,"Fragment_One");
transaction.commit();
}
das funktioniert perfekt für mich …
Mist Nguyen
Ich habe diesen Fehler, wenn ich mein Text-XML nicht in eine ViewGroup innerhalb von FrameLayout einschließe.
mögliches Duplikat von IllegalStateException: Bereits hinzugefügtes Fragment erscheint, wenn eine App sehr lange im Hintergrund war
– fweigl
19. September 2014 um 4:36 Uhr
das bedeutet, dass die Backpress ein neues Fragment hinzufügt, was ist die Logik im Backstack? Danke vielmals
– Benutzer782104
19. September 2014 um 4:37 Uhr
wird mFrag neben tab2 auch zu einer anderen Registerkarte hinzugefügt?
– Achil
19. September 2014 um 6:29 Uhr