it-swarm.com.de

IllegalStateException: Fragment bereits im Tabhost-Fragment hinzugefügt

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:

  1. Innerhalb von tab2 drücke ich die Taste, um das Fragment zu ändern
  2. Wechseln Sie zu einer anderen Registerkarte (z. B. Registerkarte 1 oder Registerkarte 3).
  3. Drücken Sie die Zurück-Taste
  4. Ausnahme werfen

Wie kann ich das beheben? Danke fürs Helfen

50
user782104

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

102
Ujju

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");
5
vovahost

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 ()

5
Deep Mehta

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 ...

4
Mehul Solanki

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. 

1
Mihab

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).

0
CoolMind

Füge das Fragment wie folgt hinzu

FragmentTransaction t = getSupportFragmentManager().beginTransaction();
    t.replace(R.id.realtabcontent, mFrag);
    t.addToBackStack(null);
    t.commitNowAllowingStateLoss();
0
M.Noman

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();
0
Farid Haq

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.

0
Seto Elkahfi