wake-up-neo.com

Fragment PopBackStack

Ich bekomme ein seltsames Problem, wenn ich Fragmente benutze und sie wieder herausnehme.

Ich habe eine Fragmentaktivität:

Schritt 1: Ich füge ein Fragment im onCreate dieser Aktivität im Start namens Fragment A als ein:

Dies ist das onCreate der Fragmentaktivität

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
    }

Schritt: 2 Danach habe ich das Fragment durch folgenden Code ersetzt:

Fragment_More moreFragment = new Fragment_More();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();

Schritt 3: Danach habe ich wieder ein Fragment auf Fragment_More hinzugefügt:

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();

und hier ist die Aktivität von my fragment onBackPressedButton Lisetener:

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    Fragment f = fm.findFragmentById(R.id.frameContent);

 if(fm.getBackStackEntryCount() > 1){
         fm.popBackStack();
    } else{
        finish();
    }
}

Hier ist das Problem, das ich bekomme:

Wenn ich von Schritt 3 aus zurückschalte, wird mir das vorherige Fragment, wie von onBackPressed beschrieben, erfolgreich zurückgegeben, es wird popbackstack und bringt mich zum vorherigen Fragment. Aber aus dem Fragment_More, wenn ich noch einmal zurückdrücke, zeigt es mir leeren FRAGMENT-Inhalt. Es zeigt nie das erste Fragment, das ich in Schritt 1 in OnCreate der Aktivität hinzugefügt hatte.

Bitte kommentieren. Was mache ich falsch?

Vielen Dank

16
Gaurav Arora

Sie sollten Ihr erstes Fragment nicht zum Backstack hinzufügen, da durch Drücken der Eingabetaste die durchgeführte Aktion umgekehrt wird. Wenn Sie also ein Fragment ersetzen und zurückdrücken, wird das ersetzte Fragment umgekehrt. Wenn Sie jedoch die Fragmenttransaktion '.add()' erneut drücken, wird sie einfach entfernt und eine leere Seite angezeigt. Ich denke, das erste Fragment aus dem Backstack zu entfernen, sollte den Trick tun. Probieren Sie es aus und lassen Sie es mich wissen!

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).commit();
    }

BEISPIEL:

Nehmen wir an, Sie haben zwei Fragmente namensA&B 

Wenn Sie .add() fragmentAauf die Seite und "addToBackStack()" (= Speichern der Aktion) speichern, haben Sie das REMOVE-FragmentAas als Aktion gespeichert, wenn Sie auf back klicken.

Wenn Sie .replace() fragmentAby fragmentBund auch "addToBackStack()" haben, haben Sie die AktionBgespeichert undAals Aktion hinzugefügt wenn du zurück klickst.

Sie sehen also, warum es nicht ratsam ist, Ihre erste Fragmenttransaktion in den Backstack aufzunehmen? Es wird nur das FragmentAdurch Zurückdrücken entfernt, was zu einer leeren Seite führt. Hoffe das ist genug Info.

Sobald Sie addToBackStack() zu Ihrem ersten Fragment entfernt haben, müssen Sie onBackPressed() nicht überschreiben, da es wie erwartet funktioniert. Die Aktion wird nur beendet, wenn sich im Backstack nichts mehr befindet, ohne dass diese leere Seite zuerst angezeigt wird.

45
Chris

Ihre Linie:

if(fm.getBackStackEntryCount() > 1){

sollte sein:

if (fm.getBackStackEntryCount() > 0) {

Sie legen 3 Fragmente auf den Rücken. Nachdem Sie die ersten beiden Einträge abgelegt haben, entspricht die Anzahl der Einträge auf dem Backstack dem Wert 1. Sie verhindern also, dass Sie das erste Fragment abrufen, das Sie dem Backstack hinzugefügt haben.

2
Jerry Frost

sie verwenden dies manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

versuchen Sie, dies stattdessen zu verwenden manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

Sag mir, ob es für dich funktioniert

0
omujeebr