2012-02-06 14 views

risposta

135

Il metodo di scollegamento rimuove il frammento dall'interfaccia utente, ma il suo stato viene gestito da Fragment Manager. Ciò significa che è possibile riutilizzare questo frammento chiamando il metodo attach, con una ViewHierarchy modificata

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

Fonte Commento

Si noterà che quando un frammento si stacca, i suoi metodi onPause, OnStop e onDestroyView sono chiamati solo (in questo ordine). D'altra parte, quando viene rimosso un frammento, vengono chiamati i 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, vengono chiamati i metodi onAttach, onCreate, onCreateView, onStart e onResume di Framment (in quest'ordine). - Adil Hussain

+134

Per aggiungere alla risposta di Rajdeep, noterete che quando un 'Fragment' è _detached_, i suoi metodi' onPause', 'onStop' e' onDestroyView' sono chiamati solo (in quest'ordine). D'altra parte, quando un 'Fragment' è _removed_, i suoi metodi' onPause', 'onStop',' onDestroyView', 'onDestroy' e' onDetach' vengono chiamati (in quest'ordine). Allo stesso modo, quando _attaching_, vengono chiamati solo i metodi 'onCreateView',' onStart' e 'onResume' di' Fragment'; e quando _adding_, i metodi 'Fragment'' onAttach', 'onCreate',' onCreateView', 'onStart' e' onResume' vengono chiamati (in quest'ordine). –

+0

C'è un veloce Q & A con Diane Hackborn [qui] (https://groups.google.com/forum/#!topic/android-platform/QlkLMsncDwg). Quindi, perché ho il log [questo] (http://stackoverflow.com/questions/18238214/stop-oncreateoptionsmenu-to-be-called-from-detached-fragment)? Come sapete che FT.detach() è stato chiamato? – Poutrathor

+0

Qual è il vantaggio di uno rispetto all'altro? Voglio sapere un caso d'uso quando uno è favorevole rispetto all'altro? Aggiungo sempre e togli, è così male? –

44

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

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

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

Ecco le conseguenti eventi del ciclo di vita e di altri valori di ritorno di metodo importante:

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

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

per rimuovere un frammento di un'attività, si utilizza:. getFragmentManager() beginTransaction() rimuovere (mFragment).. commettere().

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

Ecco le conseguenti eventi del ciclo di vita e di altri valori di ritorno di metodo importante:

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

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

ho ri-aggiunto il frammento qui

Per staccare un Frammento aggiunto da un'attività, si usa: getFragmentManager() .beginTransaction(). staccare (mFragment) .commit().

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

Ecco le conseguenti eventi del ciclo di vita e di altri valori di metodo importante di ritorno:

onPause()        
onStop()        
onDestroyView()      

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

Per ricollegare un frammento che è stato distaccato al Activity, si utilizza:. getFragmentManager() BeginTransaction(). attach (mFragment) .commit().

Crea una nuova vista da associare al frammento e mantiene l'associazione attività.

Ecco le conseguenti eventi del ciclo di vita e di altri valori di ritorno di metodo importante:

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

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

altre cose importanti da notare: Se si scollega un frammento e poi tenta di aggiungere di nuovo con add() piuttosto che attach(), nulla sembra cambiare.

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

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

+0

Buon lavoro. Ma è sembrato piuttosto interessante provare a riattaccare e aggiungere nuovamente lo stesso effetto dopo che il frammento è stato rimosso. – zgulser

+1

Quindi è risultato che "attach()" non invocherà onAttach(). "detach()" non invocherà onDetach(). –

Problemi correlati