In den Android-Dokumenten für a FragmentTransaktion Mir sind zwei sehr ähnliche Methoden aufgefallen: detach
und remove
. Die Beschreibungen dort drüben scheinen nicht viel Aufschluss darüber zu geben, wann sie verwendet werden sollen, und soweit ich das beurteilen kann, scheinen sie gleich zu sein.
Also: Was sind die Unterschiede zwischen diesen beiden Methoden?
Die Methode „detach“ entfernt das Fragment von der Benutzeroberfläche, aber sein Status wird vom Fragment Manager beibehalten. Das bedeutet, dass Sie dieses Fragment wiederverwenden können, indem Sie die Methode „attach“ mit einer geänderten „ViewHierarchy“ aufrufen
Entfernen bedeutet, dass die Fragmentinstanz nicht erneut angefügt werden kann. Sie müssen es erneut zur Fragmenttransaktion hinzufügen.
Quellenkommentar
Sie werden feststellen, dass beim Trennen eines Fragments nur seine Methoden onPause, onStop und onDestroyView aufgerufen werden (in dieser Reihenfolge). Wenn andererseits ein Fragment entfernt wird, werden seine Methoden onPause, onStop, onDestroyView, onDestroy und onDetach aufgerufen (in dieser Reihenfolge). In ähnlicher Weise werden beim Anhängen nur die Methoden onCreateView, onStart und onResume des Fragments aufgerufen; und beim Hinzufügen werden die Methoden onAttach, onCreate, onCreateView, onStart und onResume des Fragments (in dieser Reihenfolge) aufgerufen. – Adil Hussain
Die Benennung der Fragment-Management-Methoden ist selbst laut Google-Ingenieuren in Message Boards sehr verwirrend (siehe Kommentare oben). Ich habe mir selbst eine kleine Demo erstellt, um herauszufinden, wie die Dinge tatsächlich funktionieren. Hier sind meine Erkenntnisse. Fühlen Sie sich frei, mich zu korrigieren, wenn ich falsch liege.
Um anfänglich ein Fragment zu einer Aktivität hinzuzufügen, verwenden Sie: getFragmentManager().beginTransaction().add(R.id.container, mFragment).commit().
Dadurch wird die Aktivität mit dem Fragment verknüpft und auch eine Ansicht mit dem Fragment verknüpft.
Hier sind die resultierenden Lebenszyklusereignisse und andere wichtige Rückgabewerte der Methode:
onAttach()
onCreate()
onCreateView()
onViewCreated()
onActivityCreated()
onViewStateRestored()
onStart()
onResume()
mFragment.getView() == null: false
mFragment.getActivity() == null: false
Um ein Fragment aus einer Aktivität zu entfernen, verwenden Sie: getFragmentManager().beginTransaction().remove(mFragment).commit().
Dadurch wird jede Zuordnung zu einer Ansicht oder zu einer Aktivität entfernt.
Hier sind die resultierenden Lebenszyklusereignisse und andere wichtige Rückgabewerte der Methode:
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
mFragment.getView() == null: true
mFragment.getActivity() == null: true
Ich habe das Fragment hier erneut hinzugefügt
Um ein hinzugefügtes Fragment von einer Aktivität zu trennen, verwenden Sie: getFragmentManager().beginTransaction().detach(mFragment).commit().
Dadurch wird jede Zuordnung zu einer Ansicht entfernt, aber die Zuordnung zu der Aktivität bleibt erhalten.
Hier sind die resultierenden Lebenszyklusereignisse und andere wichtige Rückgabewerte der Methode:
onPause()
onStop()
onDestroyView()
mFragment.getView() == null: true
mFragment.getActivity() == null: false
Um ein Fragment, das von der Aktivität getrennt wurde, erneut anzuhängen, verwenden Sie: getFragmentManager().beginTransaction().attach(mFragment).commit().
Dadurch wird eine neue Ansicht erstellt, die mit dem Fragment verknüpft wird, und die Aktivitätszuordnung wird beibehalten.
Hier sind die resultierenden Lebenszyklusereignisse und andere wichtige Rückgabewerte der Methode:
onCreateView()
onViewCreated()
onActivityCreated()
onViewStateRestored()
onStart()
onResume()
mFragment.getView() == null: false
mFragment.getActivity() == null: false
Weitere wichtige Dinge, die zu beachten sind: Wenn Sie ein Fragment lösen und dann versuchen, es erneut hinzuzufügen, indem Sie add () anstelle von Attach () verwenden, scheint sich nichts zu ändern.
Wenn Sie versuchen, ein Fragment hinzuzufügen, das mit remove() entfernt wurde, indem Sie Attach() anstelle von Add() verwenden, scheint sich nichts zu ändern.
Wenn getView() null zurückgibt, kann das Fragment immer noch interne Verweise auf die zuletzt erstellte Ansicht haben. Diese Ansicht ist nicht mehr gültig und sollte nicht verwendet werden.