Alle Fragmente aus dem Behälter entfernen

Lesezeit: 3 Minuten

Benutzer-Avatar
Aligur

Gibt es eine Möglichkeit, alle Fragmente zu entfernen, die bereits der bestimmten Ansicht mit ihrer Ansichts-ID hinzugefügt wurden?

Zum Beispiel möchte ich alle Fragmente entfernen, die der R.id.fragmentcontainer-Ansicht hinzugefügt werden.

  • Mögliches Duplikat von Fragmenten: Alle Fragmente in einer Ansicht entfernen

    – Thomas Thiebaud

    20. Oktober 2015 um 12:55 Uhr

Benutzer-Avatar
Gipfel Saxena

Es ist sehr einfach, alle Fragmente durchzuschleifen und zu entfernen

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}

Aber im Falle von Navigationsschublade Stellen Sie sicher, dass Sie es überprüfen. Wenn Sie versuchen, es zu entfernen, erhalten Sie eine Fehlermeldung.

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
  if (fragment instanceof NavigationDrawerFragment) {
      continue;
  }
  else { 
      getSupportFragmentManager().beginTransaction().remove(fragment).commit();
  }
}

Last but not least wichtig Stellen Sie sicher, dass Sie auf null prüfen, bevor Sie Fragmenttransaktionen durchführen

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    if (fragment instanceof NavigationDrawerFragment) {
        continue;
    }
    else if (fragment != null) {
        getSupportFragmentManager().beginTransaction().remove(fragment).commit();
    }
}

  • Vielen Dank. Was ist NavigationDrawerFragment? Es wird nützlich sein, aber ich denke, es stammt aus einer Bibliothek.

    – CoolMind

    1. Dezember 2016 um 20:25 Uhr

  • NavigationDrawerFragment ist einfach ein Fragment, das als Navigationsschublade hinzugefügt wird. Es stammt aus keiner anderen Bibliothek.

    – Sumit Saxena

    2. Dezember 2016 um 6:47 Uhr

  • Ich stand vor einer Situation, in der eine FragmentTransaction add erstellt ein normales Fragment, während replace macht eine hohe Symbolleiste darüber (bei Lollipop, mit Navigationsschublade). Vielleicht hast du Recht, es wäre gut, ein Dummy-Fragment zu erstellen und add Andere. Haben Sie das getan?

    – CoolMind

    2. Dezember 2016 um 10:33 Uhr

  • Ja, ich ziehe es immer vor, Fragment als Navigationsschublade hinzuzufügen, es gibt mehr Kontrolle über Design und Änderungen

    – Sumit Saxena

    2. Dezember 2016 um 10:45 Uhr

  • Achtung, dies wird entfernt ALLE Fragmente im angegebenen Fragmentmanager. Nicht nur in einem bestimmten Layout-Container, wie OP verlangte

    – Subaru Tashiro

    3. Oktober 2018 um 5:42 Uhr


Benutzer-Avatar
Rhn Bhadani

Sie können den folgenden Code ausprobieren

getSupportFragmentManager().beginTransaction().remove(frag).commit(); 

*frag ist das Objekt des Fragments, das Sie entfernen möchten.

 OR
getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.your_container)).commit();

Es entfernt das Fragment, das im Container „your_container“ gespeichert ist.

Fröhliches Codieren.

  • Wie kann ich sicher sein, dass die Containeransicht der Frag-Objekte R.id.mycontainer ist?

    – aligur

    20. Oktober 2015 um 13:22 Uhr

  • Das ist nur als Referenz, die Sie durch Ihre IDs ersetzen können.

    – Rhn Bhadani

    20. Oktober 2015 um 13:23 Uhr

  • Das ist ein falscher Ansatz. Die Frage ist nicht, wie man ein Fragment entfernt, sondern wie man alle entfernt.

    – Vingtoft

    20. Oktober 2015 um 13:30 Uhr

  • @Vingtoft funktioniert mit: FragmentManager fragmentManager = MainActivity.activity.getSupportFragmentManager(); for(int i = 0; i < fragmentManager.getBackStackEntryCount() ; i++){ //Fragment mit Tag entfernen }

    – aligur

    20. Oktober 2015 um 13:39 Uhr

  • Vielen Dank für die Klarstellung. @ user1632209 sollte erwägen, die Antwort mit Ihrem Kommentar zu aktualisieren, das wäre für zukünftige Leute nützlich.

    – Vingtoft

    20. Oktober 2015 um 13:43 Uhr

Benutzer-Avatar
Devrath

Falls jemand in Kotlin nach einem Code sucht:

supportFragmentManager.apply {
        for (fragment in fragments) {
           beginTransaction().remove(fragment).commit()
        }
        popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    }

Es ist in der Tat sehr einfach.

private static void removeAllFragments(FragmentManager fragmentManager) {
    while (fragmentManager.getBackStackEntryCount() > 0) {
        fragmentManager.popBackStackImmediate();
    }
}

Optimierte Version
Es ist kein mehrfacher Commit-Aufruf erforderlich, also rufen wir es am Ende einmal auf

supportFragmentManager.fragments.let {
    if (it.isNotEmpty()) {
        supportFragmentManager.beginTransaction().apply {
            for (fragment in it) {
                remove(fragment)
            }
            commit()
        }
    }
}

Benutzer-Avatar
Aja Nishad

Verwenden Sie diesen Code

activity?.let {
it.supportFragmentManager.fragments.forEach { fragment ->
        it.supportFragmentManager.beginTransaction().remove(fragment).commit()
    }
}

Ich hoffe es hilft.

Vielen Dank.

Benutzer-Avatar
Vingtoft

Speichern Sie alle Ihre Fragmente in einer ArrayList.

Initialisierung:

List<Fragment> activeCenterFragments = new ArrayList<Fragment>();

Fragment zur Liste hinzufügen:

private void addCenterFragments(Fragment fragment) {
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.empty_center_layout, fragment);
    activeCenterFragments.add(fragment);
    fragmentTransaction.commit();
}

Wenn Sie entfernen möchten alle gehen Sie wie folgt vor:

private void removeActiveCenterFragments() {
    if (activeCenterFragments.size() > 0) {
        fragmentTransaction = fragmentManager.beginTransaction();
        for (Fragment activeFragment : activeCenterFragments) {
            fragmentTransaction.remove(activeFragment);
        }
        activeCenterFragments.clear();
        fragmentTransaction.commit();
    }
}

Ich benutze diese Methode seit Jahren in der Produktion und sie funktioniert wie ein Zauber. Lassen Sie mich wissen, wenn Sie Fragen haben.

  • Dies funktioniert nicht, wenn der Status wiederhergestellt wurde, nachdem Ihre App beendet wurde, da die Liste leer ist.

    – Wes Alvaro

    19. November 2020 um 5:36 Uhr

1216990cookie-checkAlle Fragmente aus dem Behälter entfernen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy