35 Stimmen

Android Fragment und Ansicht aus BackStack entfernen

enter image description here

Ich weiß, dass diese Frage schon einmal gestellt wurde, aber die bisherigen Antworten haben mich so weit gebracht. Das Szenario ist wie folgt: Wir haben ein Dashboard-Fragment (A), das einen Benutzer zu einem Anmeldebildschirm (B) führt. Nach erfolgreicher Anmeldung gelangen sie zu einer Listenansicht (C). Beim Zurückdrücken würde ich gerne zu A zurückkehren, da der Benutzer den Anmeldebildschirm nicht noch einmal sehen muss. Außerdem speichern wir bei erfolgreicher Anmeldung die Details in den gemeinsamen Einstellungen und automatisieren beim nächsten Mal die Anmeldung in B, was alles wie geplant funktioniert.

Ich habe die folgende FragmentHelper-Methode:

public static void goToNextFragement(Fragment fragment, int container, boolean addToBackStack, Fragment ctx)
    {
        // Create new fragment and transaction
        FragmentTransaction transaction = ctx.getSupportFragmentManager().beginTransaction();
        transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(container, fragment);

        if(addToBackStack)
            transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

In der Transaktion von B nach C habe ich den booleschen Wert addToBackStack auf false gesetzt, damit die transaction.addToBackStack(null); nicht aufgerufen wird. Dies wiederum funktioniert gut, aber nach ist, wo mein Problem beginnt.

Wenn der Benutzer wieder auf C drückt und zu A zurückkehrt, kann ich immer noch die aufgeblähte Ansicht von C unter der Ansicht von A sehen.

Für jede Hilfe wären wir dankbar. Ich hoffe, mein Diagramm hilft, dies einfach zu halten.

23voto

Bhavesh Hirpara Punkte 22016

Ich habe das Problem gelöst... innerhalb einer Zeile...

getFragmentManager().popBackStack();

ou

getSupportFragmentManager().popBackStack()

dies funktioniert, wenn Sie Fragmente hinzufügen und den Backstack pflegen (nicht ersetzen).

6voto

Zar E Ahmer Punkte 32557

F1 -> f2

Fragment2 f2 = new Fragment2();
this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content,f2).addToBackStack(null).commit();

hier nichts Ungewöhnliches. Im Fragment f2 führt Sie dieser Code dann zum Fragment f3.

f2 -> f3

Fragment3 f3 = new Fragment3();
getActivity().getSupportFragmentManager().popBackStack();
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit();

Ich bin nicht sicher, durch das Lesen von Docs, wenn dies funktionieren sollte, diese Poping-Transaktion-Methode soll asynchron sein, und vielleicht ein besserer Weg wäre, popBackStackImmediate() aufrufen. Aber soweit ich sagen kann, auf meinen Geräten funktioniert es einwandfrei.

Die besagte Alternative würde lauten:

final FragmentActivity activity = getActivity();
activity.getSupportFragmentManager().popBackStackImmediate();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit();

Hier wird tatsächlich kurz zu f1 zurückgegangen, bevor man zu f3 übergeht, so dass es hier eine kleine Störung gibt.

Das ist eigentlich alles, was Sie tun müssen, und das Antwort kann Ihnen auch sehr helfen.

1voto

Nikhil Sohoni Punkte 145

Es gibt mehrere Möglichkeiten, dies zu handhaben:

  1. Ich hatte einen ähnlichen Fluss in meiner App und die Art, wie ich es gelöst war durch Ersetzen der Login-Fragment mit einem AlertDialog, die von der Hauptaktivität ausgelöst wird. In Ihrem Fall wird also Fragment A auf dem Bildschirm angezeigt und wenn die Hauptaktivität denkt, dass sie den Anmeldedialog anzeigen muss, zeigt sie den AlertDialog. Das hat bei mir funktioniert.

  2. Wenn Fragment A aktiviert ist, kann es prüfen, ob Fragment C vorhanden ist, indem es den FragmentManager fragt. Wenn es existiert, wird es entfernt.

1voto

Azizi Musa Punkte 999

Schritt 1 : Wenn Sie sich in Fragment A befinden und Fragment B öffnen möchten

getFragmentManager().beginTransaction()
.replace(android.R.id.content, new FragmentB(), FragmentB.class.getName()
.addToBackStack(null)
.commit();

Schritt 2 : Wenn Sie sich in Fragment B befinden und Fragment C öffnen möchten

getFragmentManager().beginTransaction()
.replace(android.R.id.content, new FragmentC(), FragmentC.class.getName()
.disallowAddToBackStack() // << this to make Fragment B, not included in the backstack
.commit();

Schritt 3: Wenn Sie sich im Fragment C befinden und die Zurück-Taste des Geräts oder getFragmentManager().popBackStack(); werden Sie das Fragment A öffnen.

PS: In Aktivität verwenden Sie dies getSupportFragmentManager() . Wenn Sie in Fragment sind, verwenden Sie dies getFragmentManager()

0voto

Kelly Merrell Punkte 1225

Wenn man dem FM nicht mitteilt, dass der Übergang von B nach C zum backStack hinzugefügt werden soll, bedeutet dies, dass das FM keine Aufzeichnung über das Hinzufügen von C hat, wenn man auf back drückt, so dass es es nicht entfernt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X