webentwicklung-frage-antwort-db.com.de

So löschen Sie ein bestimmtes Fragment aus dem hinteren Stapel in Android

Ich habe ein Problem beim Entfernen eines bestimmten Fragments aus dem hinteren Stapel. Mein Szenario sieht so aus. Fragment-1 wird durch Fragment-2 ersetzt, und dann wird Fragment-2 durch Fragment-3 ersetzt.

Aufruf der Bestellung; Fragment-1 -> Fragment-2 -> Fragment-3.

Wenn Fragment-3 auf dem Bildschirm angezeigt wird und dann auf die Schaltfläche "Zurück" geklickt wird, möchte ich fortfahren 

Fragment-1. Das heißt, ich möchte Fragment-2 vom Back Stack löschen.

Wie macht man das ? 

17
nihasmata

Im Backstack haben Sie nicht Fragments, sondern FragmentTransactions. Wenn Sie popBackStack() verwenden, wird die Transaktion erneut angewendet, jedoch rückwärts. Dies bedeutet, dass Sie (jedes Mal, wenn Sie addToBackStackTrace(null) annehmen) in Ihrem Backstack haben

1->2
2->3

Wenn Sie die zweite Transaktion nicht zum Backstack hinzufügen, führt dies dazu, dass Ihr Backstack gerade ist

1->2

wenn Sie also die Zurück-Taste drücken, wird 2->1 ausgeführt. Dies führt zu einem Fehler, da das Fragment 2 nicht vorhanden ist (Sie befinden sich in Fragment 3).
Die einfachste Lösung ist, den Backstack vor dem Wechsel von 2 auf 3 zu platzieren

//from fragment-2:
getFragmentManager().popBackStack();
getFragmentManager().beginTransaction()
   .replace(R.id.container, fragment3)
   .addToBackStack(null)
   .commit();

Was ich hier mache, ist Folgendes: Von Fragment 2 gehe ich zurück zu Fragment 1 und dann direkt zu Fragment 3. Auf diese Weise wird der Zurück-Button mich wieder von 3 auf 1 bringen.

26
Ilario

Ich hatte ein sehr ähnliches Szenario wie Sie. Meine Lösung überprüfte nur die Anzahl der BackStack-Transaktionen, die ich hatte.

Wenn die Transaktionen mehr als 0 waren, würde ich sie einfach gleich platzieren so würde es beim Zurückdrücken überspringen.

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStackImmediate();
}
...
fragmentTransaction.replace(R.id.main_fragment, newFrag, MAIN_FRAGMENT_TAG);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.commit();

Dies wäre erfolgreich:

  • A -> B (zurück gedrückt) -> zurück zu A

  • A -> B -> C (zurück gedrückt) -> zurück zu A

Der einzige Nachteil, den ich sehe, ist, dass es einen schnellen Flash gibt, bei dem Fragment A angezeigt wird, bevor es zu Fragment C geht.

9
Iv4n

Wenn Sie alle drei Fragmente in derselben Aktivität hinzufügen/starten, verwenden Sie anstelle der add()-Methode von FragmentTransaction zum Anzeigen von Fragment3 die replace()-Methode von FragmentTransaction (ersetzen Sie Fragment2 durch Fragment3). Die replace-Methode entfernt das aktuelle Fragment aus dem Backstack, bevor das neue Fragment hinzugefügt wird. Wenn Sie Fragment3 aus einer anderen Aktivität starten und daher replace() nicht verwenden können/möchten, entfernen Sie Fragment2 aus dem Backstack, bevor Sie die neue Aktivität starten (was Fragment3 hinzufügt):

// in Fragment2, before adding Fragment3:
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
               .remove(this) // "this" refers to current instance of Fragment2
               .commit();
fragmentManager.popBackStack();
// now go ahead and launch (add) fragment3
// if fragment3 is launched from a different activity, 
// start that activity instead
fragmentManager.beginTransaction()
               .add(R.id.a_container_view_in_activity, new Fragment3(),
                    Fargment3.FRAGMENT3_ID)
               .commit();
4

Code für Fragment A -> Fragment B :

Hinzufügen FragmentAin BackStack von Fragmenten

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame_layout_container, new fragmentB());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

Code für Fragment B -> Fragment C :

Nicht hinzufügen FragmentBin BackStack von Fragmenten

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame_layout_container, new fragmentC());
fragmentTransaction.commit();

Es wird auf diese Weise funktionieren: A -> B -> C und während Rückkehr C -> A als Sie ausgenommen.

Ich hoffe es wird dir helfen.

2
Hiren Patel

Sie fügen den Back-Status aus der FragmentTransaction-Datei hinzu und entfernen ihn mit den FragmentManager-Pop-Methoden aus dem Backstack:

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();

ODER

Sie können das Fragment einfach vom Hinzufügen in den Fragmentstack überspringen, sodass Sie bei Rückkehr von Fragment-3 zu Fragment-1 zurückkehren.

Aktualisierte :

Um die Animation zu deaktivieren, müssen Sie die onCreateAnimation-Methode überschreiben.

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    if (disableAnim) {
        Animation a = new Animation() {};
        a.setDuration(0);
        return a;
    }
    return super.onCreateAnimation(transit, enter, nextAnim);
}
2
Kartheek
   for (int i = 0; i < mFragmentManager.getBackStackEntryCount(); i++) {
        currentFragment = mFragmentManager.getFragments().get(i);
        if (!(currentFragment instanceof ParticularFragment))
            mFragmentManager.popBackStack();
        else
            break;
    }
1
Rudee