Qual è la differenza tra staccare un frammento e rimuoverlo?


118

Nella documentazione di Android per una FragmentTransaction ho notato due metodi molto simili: detache remove. Le descrizioni laggiù non sembrano fornire molte informazioni su quando usarle e da quello che posso dire sembrano essere le stesse.

Allora: quali sono le differenze tra questi due metodi?

Risposte:


156

Il metodo detach rimuove il frammento dall'interfaccia utente, ma il suo stato viene mantenuto dal Fragment Manager. Ciò significa che puoi riutilizzare questo frammento chiamando il metodo attach, con un ViewHierarchy modificato

Rimuovi significa che l'istanza del frammento non può essere ricollegata. Dovrai aggiungerlo di nuovo alla transazione del frammento.

Commento di origine

Noterai che quando un frammento viene scollegato, i suoi metodi onPause, onStop e onDestroyView vengono chiamati solo (in quest'ordine). D'altra parte, quando un Fragment viene rimosso, vengono chiamati i suoi metodi onPause, onStop, onDestroyView, onDestroy e onDetach (in quest'ordine). Allo stesso modo, durante il collegamento, vengono chiamati solo i metodi onCreateView, onStart e onResume di Fragment; e quando si aggiunge, i metodi onAttach, onCreate, onCreateView, onStart e onResume di Fragment vengono chiamati (in quest'ordine).- Adil Hussain


145
Per aggiungere alla risposta di Rajdeep, noterete che quando una Fragmentè distaccato , le sue onPause, onStope onDestroyViewmetodi vengono chiamati solo (in questo ordine). D'altra parte, quando una Fragmentviene rimosso , le sue onPause, onStop, onDestroyView, onDestroye onDetachmetodi vengono chiamati (in questo ordine). Analogamente, quando il fissaggio , i Fragment's onCreateView, onStarte onResumemetodi vengono chiamati solo; e quando l'aggiunta , i Fragment's onAttach, onCreate, onCreateView, onStarte onResumemetodi vengono chiamati (in questo ordine).
Adil Hussain

1
C'è un veloce Q&A con Diane Hackborn qui . Allora perché ho questo registro? Come fai a sapere che è stato chiamato FT.detach ()?
Poutrathor

1
Qual è il vantaggio dell'uno sull'altro? Voglio sapere un caso d'uso in cui uno è favorevole rispetto all'altro? Aggiungo e rimuovo sempre, è così male?
Neon Warge

1
Miglior chiarimento breve e conciso.
Robotec

55

La denominazione dei metodi di gestione dei frammenti è molto confusa anche secondo gli ingegneri di Google sulle bacheche (vedi commenti sopra). Mi sono fatto una piccola demo per capire come funzionano effettivamente le cose. Ecco le mie scoperte. Sentiti libero di correggermi se sbaglio.

Per aggiungere inizialmente un frammento a un'attività, utilizzare: getFragmentManager (). BeginTransaction (). Add (R.id.container, mFragment) .commit ().

Questo associa l'attività al frammento e associa anche una vista al frammento.

Di seguito sono riportati gli eventi del ciclo di vita risultanti e altri importanti valori restituiti dal metodo:

onAttach()           
onCreate()           
onCreateView()       
onViewCreated()      
onActivityCreated()  
onViewStateRestored()
onStart()            
onResume()

mFragment.getView() == null: false                    
mFragment.getActivity() == null: false

Per rimuovere un frammento da un'attività, utilizzare: getFragmentManager (). BeginTransaction (). Remove (mFragment) .commit ().

Ciò rimuove qualsiasi associazione con una vista o un'attività.

Di seguito sono riportati gli eventi del ciclo di vita risultanti e altri importanti valori restituiti dal metodo:

onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()

mFragment.getView() == null: true
mFragment.getActivity() == null: true

Ho aggiunto nuovamente il frammento qui

Per scollegare un frammento aggiunto da un'attività, utilizzare: getFragmentManager (). BeginTransaction (). Detach (mFragment) .commit ().

Ciò rimuove qualsiasi associazione con una vista, ma mantiene l'associazione con l'attività.

Di seguito sono riportati gli eventi del ciclo di vita risultanti e altri importanti valori restituiti dal metodo:

onPause()                             
onStop()                              
onDestroyView()                      

mFragment.getView() == null: true
mFragment.getActivity() == null: false

Per ricollegare un frammento che è stato scollegato all'attività, utilizzare: getFragmentManager (). BeginTransaction (). Attach (mFragment) .commit ().

Questo crea una nuova vista da associare al frammento e mantiene l'associazione dell'attività.

Di seguito sono riportati gli eventi del ciclo di vita risultanti e altri importanti valori restituiti dal metodo:

onCreateView()                        
onViewCreated()                       
onActivityCreated()                   
onViewStateRestored()                 
onStart()                             
onResume()                            

mFragment.getView() == null: false
mFragment.getActivity() == null: false

Altre cose importanti da notare: se scolleghi un frammento e poi provi ad aggiungerlo di nuovo usando add () invece di attach (), nulla sembra cambiare.

se si tenta di aggiungere un frammento che è stato rimosso utilizzando remove () utilizzando attach () invece di add (), non sembra cambiare nulla.

Quando getView () restituisce null, il frammento potrebbe ancora avere riferimenti interni all'ultima vista creata. Questa visualizzazione non è più valida e non deve essere utilizzata.


1
Buon lavoro. Ma sembrava piuttosto interessante provare a ricollegare e riaggiungere per avere lo stesso effetto dopo che il frammento è stato rimosso.
stdout

9
Quindi si è scoperto che "attach ()" non richiama onAttach (). "detach ()" non richiamerà onDetach ().
KunYu Tsai

1
E alcuni di questi eventi del ciclo di vita possono cambiare leggermente se mantieni le transazioni nello stack indietro.
stdout
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.