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.
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). –
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
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? –