Android-Fragmente: Wann wird das Ausblenden / Anzeigen oder Hinzufügen / Entfernen / Ersetzen verwendet?

117

Angenommen, ich möchte das aktuelle Fragment in einer Containeransicht durch ein anderes ersetzen. Ist es besser zu ersetzen ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... oder folgendes mit Ein- und Ausblenden?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

Ist eine Möglichkeit, dies effizienter zu machen? Es gibt nicht viele Informationen darüber, wann diese Methoden verwendet werden sollen oder wie sie sich auf den Lebenszyklus der beteiligten Fragmente auswirken. Vielen Dank!

Robert Karl
quelle
Wenn ich von Fragment A zu Fragment B gehe und dann zu Fragment A zurückkehre, wie kann ich sicherstellen, dass ein Lebenszyklusereignis wie onCreateView nicht für Fragment A aufgerufen wird? funktioniert das Finden von Fragmenten nach Tags?
BlackHawk

Antworten:

135

Sie sollten überlegen, was Sie mit dem Fragment tun möchten, um zu entscheiden, welchem ​​Pfad Sie folgen möchten. Wenn Sie eine FragmentTransaction verwenden, um das Fragment auszublenden, befindet es sich möglicherweise noch im laufenden Zustand seines Lebenszyklus, aber seine Benutzeroberfläche wurde vom Fenster getrennt, sodass es nicht mehr sichtbar ist. Sie können also technisch immer noch mit dem Fragment interagieren und die Benutzeroberfläche später erneut anbringen. Wenn Sie das Fragment ersetzen, ziehen Sie es tatsächlich aus dem Container und es durchläuft alle Teardown-Ereignisse im Lebenszyklus (onPause, onStop usw.). Wenn Sie dieses Fragment aus irgendeinem Grund erneut benötigen, müssen Sie es erneut ausführen Setzen Sie es wieder in den Container ein und lassen Sie es erneut durchlaufen.

Wenn die Wahrscheinlichkeit groß ist, dass Sie dieses Fragment erneut benötigen, blenden Sie es einfach aus, da das Neuzeichnen des Layouts kostengünstiger ist als das vollständige Neuinitialisieren.

David C. Sainte-Claire
quelle
5
Für unsere Bedürfnisse ist das Initialisieren des Fragments ziemlich teuer, also werden wir wahrscheinlich damit weitermachen hide()und show()sparen! Danke dafür!
Robert Karl
2
Hallo, wenn Sie sagen, vom Fenster trennen, meinen Sie damit, dass der Rückruf onDetach () aufgerufen wird? Ich habe das experimentiert, es scheint, dass es nicht der Fall ist.
GingerJim
wahrscheinlich meinte er "loslösen"; Ein Fragment kann auch abgetrennt / wieder angebracht werden (zusätzlich zum Hinzufügen / Entfernen,
Anzeigen
1
@ Zainodis, ich habe das gleiche Problem auch. Meine Lösung besteht darin, den verborgenen Status des Fragments in onSaveInstanceState () zu speichern - savedInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); dann in onCreate () if (savedInstanceState! = null) den verborgenen Zustand zurückbekommen und wenn das Fragment versteckt ist, dann verstecke es mit der Transaktion.
worawee.s
1
@ worawee.s Hey da und danke für das Update :)! Ich habe das Problem vor einiger Zeit gelöst - ich brauchte das Verstecken / Einblenden usw. nicht wirklich, also habe ich es komplett gelöscht und jetzt gehe ich mit Standards wie Hinzufügen / Ersetzen oder Einzelfragmentaktivitäten in einem einzelnen Bereich vor (im Grunde genommen Master-Detailfluss). . Für diejenigen, die Hide noch verwenden, ist Ihre Lösung sehr hilfreich - und die Überprüfung von savedInstance! = Null war einer der Fehler, die ich zuvor gemacht habe.
AgentKnopf
5

Sie haben sich im Grunde selbst geantwortet. Wenn Sie ersetzen möchten (so dass altes Fragment nicht mehr benötigt wird), verwenden replace()Sie, wenn Sie es vorübergehend ausblenden möchten, dann tun Sie dies hide().

Marcin Orlowski
quelle
Grundsätzlich ersetzt removeAll. Ich konnte das passende hideAll :(
AlikElzin-kilaka
@ AlikElzin-kilaka In meiner Aktivität 3 Fragment in allen drei Fragmenten hole ich Daten aus dem Netzwerk, welche Methode ich befolgen sollte
Mansukh Ahir
0

Ich habe die Hide / Show-Methode in meiner Aktivität mit 4 Fragmenten verwendet. Sie hat meine Lösung gelöst, aber einige Zeit nach dem Zufallsprinzip, wenn ich meinen Dialog zeige, gibt es eine Ausnahme für fehlerhafte Token, wenn ich die Methode zum Hinzufügen und Ersetzen verwende. Dann tritt keine fehlerhafte Token-Ausnahme auf, also denke ich, dass show / Die Versteckmethode ist nicht perfekt

Dishant Kawatra
quelle