09-19 12:23:01.084: E/AndroidRuntime(24169): FATAL EXCEPTION: main
09-19 12:23:01.084: E/AndroidRuntime(24169): Process: com.example.loan, PID: 24169
09-19 12:23:01.084: E/AndroidRuntime(24169): Java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form}
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.Java:1192)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.Java:722)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.Java:1533)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.Java:489)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1484)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.Java:450)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.os.Handler.handleCallback(Handler.Java:733)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.os.Handler.dispatchMessage(Handler.Java:95)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.os.Looper.loop(Looper.Java:136)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.app.ActivityThread.main(ActivityThread.Java:5068)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Java.lang.reflect.Method.invokeNative(Native Method)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Java.lang.reflect.Method.invoke(Method.Java:515)
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:792)
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:608)
09-19 12:23:01.084: E/AndroidRuntime(24169): 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 (die die Funktion in der Fragmentaktivität aufruft) durchzuführen.
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commit();
Es gibt eine Ausnahme, wenn ich so laufe:
Wie kann ich das beheben? Danke fürs Helfen
Dies geschieht, wenn wir versuchen, dasselbe Fragment oder DialogFragment zweimal zuzufügen, bevor
ruf einfach an
if(mFragment.isAdded())
{
return; //or return false/true, based on where you are calling from
}
Ich sehe jedoch keinen Grund, warum ich das alte Fragment entfernen und das gleiche Fragment erneut hinzufügen sollte, da wir die Benutzeroberfläche/Daten aktualisieren können, indem wir einfach Parameter an die Methode innerhalb des Fragments übergeben
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");
Sie müssen nur eine Bedingung in Ihrem unten aufgeführten Fragment überprüfen:
if(!isAdded())
{
return;
}
isAdded = Gibt "true" zurück, wenn das Fragment derzeit seiner Aktivität hinzugefügt wird. Aus dem offiziellen Dokument entnommen . Dieses Fragment wird nicht hinzugefügt, wenn es bereits hinzugefügt wurde
Überprüfen Sie den Link für eine Referenz:
http://developer.Android.com/reference/Android/app/Fragment.html#isAdded ()
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 ...
Manchmal passiert es, dass im entsprechenden Layout keine richtige ID gefunden wird. Ich stand vor diesem Problem. Nach vielen Stunden stellte ich fest, dass ich eine falsche Recycler-ID eingestellt habe. Ich ändere es und funktioniert gut für mich.
Überprüfen Sie also Ihr Fragment-Layout.
Es kann sogar vorkommen, dass Sie in FragmentStatePagerAdapter
Ihrer ViewPager
ein bereits vorhandenes Element erstellen:
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).
Füge das Fragment wie folgt hinzu
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commitNowAllowingStateLoss();
Für mich funktioniert das so:
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();
Zu meiner Überraschung machte ich einen blöden Fehler, indem ich die Fragment-Transaktion zweimal aufrief:
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 denselben Fehler machen.