Fragmente wurden noch zu backstack hinzugefügt, ohne addToBackStack aufzurufen, warum?

8

Ich mache meine Splitter Helfer Klasse und ich habe ein Problem damit.

Ich nenne es FragmentChanger

Es hat fragmentContainer , was ein ViewGroup ist, das alle Fragmente enthält, die ich zeigen möchte.

Ich habe mein eigenes replace(Fragment fragmentToChange, boolean needSaveToBackStack)

gemacht

Funktion, die ist:

  • Entfernen des alten Fragments aus dem fragmentContainer
  • Hinzufügen eines neuen Fragments zum fragmentContainer
  • Optional wird in backStack gespeichert, ob needSaveToBackStack ist true oder false .

Der Fehler ist der folgende:

Wenn ich meine Replace-Funktion beim Speichern in backStack verwende, funktioniert es einwandfrei. Ich kann die Rücktaste meines Geräts verwenden, um zurück und zurück zu vorher hinzugefügten Fragmenten zu gelangen. Es funktioniert wie ein Charm.

Aber wenn ich ein Fragment durch AUS speichern in backStack ersetzen möchte, ist etwas in meinem Code falsch, denn wenn ich zurücktrete, kann ich auf dem Bildschirm das Fragment sehen, das ich NICHT zum BackStack hinzugefügt , und ALSO kann ich gleichzeitig ein anderes zuvor hinzugefügtes Fragment sehen!

So kann ich zur gleichen Zeit zwei Fragmente sehen:

Das ist mein Code:

%Vor%

Und das ist meine MainActivity, wo ich meine Fragment-Helper-Klasse teste:

%Vor%

}

Ps: Ich kann deutlich sehen, dass fragmentB nie auf dem backStack ist, wenn ich den Stack jedes Mal neulogge, wenn ich ein Fragment durch meine Hilfsklasse ersetze. Warum erscheint es, wenn ich den Button zurückdrücke?

Ich schätze jeden Rat sehr, dies ist mein erster Versuch, Fragmente mit meiner eigenen Hilfsklasse zu verwenden, und ich möchte sie sehr nützlich machen.

    
Adam Varhegyi 28.01.2014, 13:58
quelle

3 Antworten

2

Also hier, was ich falsch mit Ihrem Code gefunden habe:

1) Sie mischen Tags von Fragment und BackStackEntry .

%Vor%

Hier erhalten Sie also das Tag BackStackEntry (nicht Fragment ), das Sie in fragmentTransaction.addToBackStack() hinzufügen oder nicht. Daher erhalten Sie den falschen Status und verwenden es als aktuelles Fragment.

2) Es ist im Allgemeinen keine gute Idee, Fragmente wie in Ihren Klassenfeldern zu speichern und wiederzuverwenden: FragmentA fragmentA; . Es kann zu Problemen mit Staat und Inflation kommen, es ist besser, sie bei jeder Transaktion zu erstellen, wenn Sie keine zusätzlichen Rätsel lösen wollen.

    
Dmide 04.02.2014, 17:58
quelle
1

Versuchen Sie, das Fragment mithilfe der FragmentTransacion.replace-Methode zu ersetzen, wie im Link hier

Und Sie können sich auch auf dieses Beispiel beziehen. Das funktioniert für mich perfekt.

    
OAEI 28.01.2014 14:28
quelle
0

Zuerst fügen Sie im Konstruktor Ihrer FragmentChanger -Klasse alle Fragmente in Ihren Backstack ein. Da Sie sie in der Reihenfolge hinzufügen, werden sie als A, B und dann C hinzugefügt. Nachdem Sie sie in dieser Reihenfolge zum Backstack hinzugefügt haben, machen Sie noch weitere Transaktionen. Vermeiden Sie beim Initialisieren, sie dem Backstack hinzuzufügen. Fügen Sie sie nur hinzu oder entfernen Sie sie, während Sie den eigentlichen Knopf klicken.

Es gibt viele Ersetzungen in Ihrem Code, so dass ich nicht weiß, wie ich das wirklich beheben kann, aber ich kann Ihnen einen allgemeinen Überblick darüber geben, was Sie tun sollten.

Wenn Sie ein Fragment zum backStack hinzufügen wollen, dann machen Sie .replace(params ).addToBackStack(Tag)

Wenn Sie kein bestimmtes Fragment hinzufügen möchten, überspringen Sie einfach die Zeile addToBackStack(Tag) vollständig.

Auch Ihr getCurrentFragment() kann in

geändert werden

Fragment currentFrag=getFragmentManager().findFragmentById(R.id.fragment_container);

Lesen Sie diese ANTWORT hier für eine bessere Erklärung und auch diese ANTWORT

    
Android2390 04.02.2014 21:17
quelle

Tags und Links