Was ist der Unterschied zwischen dem Trennen und Entfernen eines Fragments?

Lesezeit: 4 Minuten

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?

Benutzer-Avatar
Rajdeep Dua

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

  • Um Rajdeeps Antwort zu ergänzen, werden Sie Folgendes bemerken, wenn a Fragment ist losgelöstes ist onPause, onStop und onDestroyView Methoden werden nur (in dieser Reihenfolge) aufgerufen. Andererseits, wenn a Fragment ist ENTFERNTes ist onPause, onStop, onDestroyView, onDestroy und onDetach Methoden aufgerufen werden (in dieser Reihenfolge). Ebenso wann Anbringendas Fragment‘s onCreateView, onStart und onResume Methoden werden nur aufgerufen; und wann Hinzufügendas Fragment‘s onAttach, onCreate, onCreateView, onStart und onResume Methoden aufgerufen werden (in dieser Reihenfolge).

    – Adil Hussain

    26. Juni 2012 um 10:46 Uhr


  • Es gibt ein schnelles Q&A mit Diane Hackborn hier. Warum habe ich dieses Protokoll? Woher wissen Sie, dass FT.detach() aufgerufen wurde?

    – Poutrathor

    16. August 2013 um 8:07 Uhr

  • Was ist der Vorteil des einen gegenüber dem anderen? Ich möchte einen Anwendungsfall wissen, wenn einer gegenüber dem anderen günstig ist? Ich füge immer hinzu und entferne, ist das schlimm?

    – Neon Warge

    14. August 2016 um 3:04 Uhr


  • Beste kurze und prägnante Aufklärung.

    – Odai A. Ali

    28. September 2019 um 13:07 Uhr

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.

  • Gute Arbeit. Aber es schien ziemlich interessant zu versuchen, das erneute Anbringen und erneute Hinzufügen den gleichen Effekt zu haben, nachdem das Fragment entfernt wurde.

    – stdout

    21. Oktober 2016 um 11:50 Uhr

  • Es stellte sich also heraus, dass “attach()” onAttach() nicht aufruft. “detach()” ruft onDetach() nicht auf.

    – KunYu Tsai

    16. August 2017 um 22:46 Uhr


  • Und einige dieser Lebenszyklusereignisse können sich geringfügig ändern, wenn Sie Transaktionen im Backstack behalten.

    – stdout

    8. Januar 2019 um 23:13 Uhr

1333940cookie-checkWas ist der Unterschied zwischen dem Trennen und Entfernen eines Fragments?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy