So entfernen Sie Fragmente vom Backstack

73

Ich habe eine Aktivität A, die das Fragment Bf aufruft, das das Fragment aufruft. Ich möchte, dass Bf im Backstack platziert wird, wenn Cf aufgerufen wird, damit Benutzer dorthin zurück navigieren können. Wenn jedoch eine bestimmte Taste in Cf gedrückt wird, möchte ich, dass Bf aus dem Backstack entfernt wird. Ist das möglich?

Ich sehe, dass es eine popBackStack () -Funktion gibt. Ich bin jedoch etwas verwirrt darüber, wie dies funktionieren würde. Ist es sicher, diese Funktion zu verwenden? Gibt es eine Möglichkeit, dass eine Aktivität aus einer anderen Anwendung nach Bf in den Backstack eingefügt wird?

Gibt es auch eine Möglichkeit, den savedInstanceState des Fragments im Backstack zu ändern?

Ich kann einfach nicht herausfinden, wie ich mit dem Emulator einen robusten Test auf dem Backstack durchführen kann.

user2085335
quelle
Vermeiden Sie Rückstapel! es hilft nicht wirklich bei der Gesamteffizienz! Verwenden Sie plain replace () oder entfernen oder fügen Sie jedes Mal, wenn Sie navigieren möchten, noch besser hinzu! Überprüfen Sie meinen Beitrag auf stackoverflow.com/questions/5802141/…
stack_ved
1
@stack_ved keine gute Idee. BackStacks sind eine großartige Sache. Übrigens kann ich Ihren Beitrag nicht sehen. Ich denke, es wurde abgelehnt. : P
Sufian

Antworten:

130

Sie können das Fragment nach Namen einfügen. Geben Sie dem hinteren Stapel beim Hinzufügen von Fragmenten einfach einen Namen.

fragmentTransaction.addToBackStack("fragB");
fragmentTransaction.addToBackStack("fragC");

Popupen Sie dann in Fragment_C den Backstack mit dem Namen ie .. fragBund includePOP_BACK_STACK_INCLUSIVE

someButtonInC.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        FragmentManager fm = getActivity()
                .getSupportFragmentManager();
        fm.popBackStack ("fragB", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
});
Archie.bpgc
quelle
12
Es funktioniert auch, wenn wir in der fm.popBackStack-Methode keine Parameter übergeben. fm.popBackStack ();
Kailas
Was ist, wenn ich es beim Drücken der Zurück-Taste schaffen möchte?
Akshay
1
@Akki Wenn Sie "Add to Backstack" verwenden, wird bereits das zuletzt hinzugefügte Fragment angezeigt, wenn Sie auf das Element "Back Navigation" klicken. Es sind also keine zusätzlichen Schritte erforderlich, um eine normale Navigation zurück durchzuführen. Nur wenn Sie die Zurück-Taste drücken müssen, müssen Sie etwas anderes als eine normale Navigation mit einem Schritt zurück ausführen.
Über den
1
Was ist, wenn dieses Fragment das erste Fragment war, dann wird addToBackStackmit replaceein Problem verursachen. Wie kann man das machen, ohne anzurufen addToBackStack?
Hamzeh Soboh
4
Laut doc "werden alle Zustände bis zu diesem Zustand gelöscht", nicht nur ein bestimmtes Fragment.
Vahid Ghadiri
14

Drei Möglichkeiten, Fragment von BackStack zu entfernen

Fügen Sie einfach eine dieser Zeilen hinzu:

1)

getActivity().getSupportFragmentManager().popBackStack();

2)

getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

3)

getActivity().getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

Sie sind alle einfache Möglichkeiten, Fragmente von Backstack zu entfernen

MD Khali
quelle
Vielen Dank hhhh! Nachdem ich onbackpressed übersteuert hatte, half mir das wirklich, zurück zu gehen. Ich habe ungefähr eine Stunde
lang
1

Wenn wir zuerst das Fragment container_view ersetzen, fügen wir den Namen wie "Spätere Transaktion" hinzu.

   getSupportFragmentManager().beginTransaction().replace(R.id.container_view, 
    profileFragment, "Profile").addToBackStack("Later Transaction").commit();

Drücken Sie dann beim Zurück-Drücken der Taste den Back-Stack mit dem Namen Later Transaction

     int count = getSupportFragmentManager().getBackStackEntryCount();
    if(count > 1) {
     getSupportFragmentManager().popBackStack("Later Transaction", 
     FragmentManager.POP_BACK_STACK_INCLUSIVE);
    } else {
        DialogUtils.show(HomeActivity.this, 
        getString(R.string.exit_app_message), getString(R.string.alert), 
       "Yes","No", new DialogUtils.ActionListner() {
            @Override
            public void onPositiveAction() {
                finish();
            }
            @Override
            public void onNegativeAction() {
            }
        });
    }
Abhijit Rajmane
quelle
Tolle Lösung für die Verwaltung der Anzahl der Fragmente im
Backstack
0

Hier ist ein Beispiel, um das letzte Fragment mit zu platzen BackStackEntry

val manager = supportFragmentManager
try {
    // get last entry (you can get another if needed)
    val entry = manager.getBackStackEntryAt(manager.backStackEntryCount - 1)
    // you can pop it by name
    manager.popBackStack(entry.name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    // or pop by id
    manager.popBackStack(entry.id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
} catch (ex: Exception) {
    ex.printStackTrace()
}
Andrey Turkovsky
quelle