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)
Also habe ich eine Android App, die mit dem Tabhost erstellt. Insgesamt gibt es drei Registerkarten. In Tab2 befindet sich eine Schaltfläche zum Ausführen der Fragmenttransaktion in Tab2 (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 der Registerkarte 2 drücke ich die Taste, um das Fragment zu ändern
- Gehen Sie zu einer anderen Registerkarte (z. B. Registerkarte 1 oder Registerkarte 3).
- Drücken Sie die Zurück-Taste
- Ausnahme auslösen
Wie kann man das beheben? Danke fürs Helfen
Antworten:
Dies geschieht, wenn wir zweimal versuchen, dasselbe Fragment oder DialogFragment hinzuzufügen, bevor wir es schließen.
Ruf einfach an
if(mFragment.isAdded()) { return; //or return false/true, based on where you are calling from }
Trotzdem 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
quelle
isAdded()
. Zweitens wird in den Kommentaren vorgeschlagen, dass dieser Code eingehtonCreate()
, was ebenfalls unsinnig ist. Diese Codezeile sollte direkt vor der Zeile stehen, in der das Fragment hinzugefügt (oder ersetzt) wird, nicht inonCreate()
oderonCreateView()
. Es ist zu spät, diesen Code in einer dieser Methoden auszuführen.if(fragment.isAdded()) fragmentTransaction.show(fragment);
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");
quelle
setArguments
, bezog sich auf das Senden von Argumenten als zu aktualisierende Parameter, also hat das Entfernen und Hinzufügen desselben Fragments keinen Sinn, oder?Sie müssen nur eine Bedingung in Ihrem unten genannten Fragment überprüfen:
if(!isAdded()) { return; }
isAdded = Gibt true 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
Überprüfen Sie den folgenden Link als Referenz:
http://developer.android.com/reference/android/app/Fragment.html#isAdded ()
quelle
onCreate
?Manchmal kommt es vor, dass im jeweiligen Layout keine richtige ID gefunden wird. Ich war mit diesem Problem konfrontiert. Dann, nach vielen Stunden, stellte ich fest, dass ich die falsche Recyclerview-ID eingestellt hatte. Ich ändere es und funktioniert gut für mich.
Überprüfen Sie also Ihr Fragmentlayout.
quelle
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 ...
quelle
Ich habe diesen Fehler, wenn ich mein Body-XML nicht in eine ViewGroup in FrameLayout einbinde.
Error:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".screens.home.HomeEpoxyFragment"> <androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:overScrollMode="never" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </FrameLayout>
Gelöst:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".screens.home.HomeEpoxyFragment"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:overScrollMode="never" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout>
Hoffe das kann jemandem helfen.
quelle
Für mich funktioniert es wie:
Fragment oldFragment = manager.findFragmentByTag(READER_VIEW_POPUP); if (oldFragment != null) { manager.beginTransaction().remove(oldFragment).commit(); } FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commit();
quelle
Es kann sogar vorkommen, dass Sie in
FragmentStatePagerAdapter
IhremViewPager
einen Artikel erstellen, der bereits vorhanden ist:override fun getItem(position: Int): Fragment { return tabs[0] // Right variant: tabs[position] }
(
private val tabs: List<Fragment>
ist eine Liste von Fragmenten in Registerkarten).quelle
return tabs[position]
in der zweiten Zeile.return tabs[position]
aber es wirft immer noch einen FehlerFragmentStatePagerAdapter
wirft den Fehler eingetItem
?ViewPager
abgerufen werdenZu meiner Überraschung habe ich einen dummen Fehler gemacht, indem ich die Fragmenttransaktion zweimal aufgerufen habe:
if (!FirebaseManager.isClientA && !FirebaseManager.isClientB) { fragment = new FragmentA(); getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit(); } else if (FirebaseManager.isClientB) { fragment = new FragmentB(); } else { fragment = new FragmentC(); } getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit();
Stellen Sie sicher, dass Sie nicht den gleichen Fehler machen.
quelle
Fügen Sie das Fragment wie folgt hinzu
FragmentTransaction t = getSupportFragmentManager().beginTransaction(); t.replace(R.id.realtabcontent, mFrag); t.addToBackStack(null); t.commitNowAllowingStateLoss();
quelle
addToBackStack
nicht zulässig istcommitNow
.Sie können dies versuchen:
if (dialogFolderGallery.isAdded()) { dialogFolderGallery.dismiss(); } else { //bla...bla.. }
quelle