2012-02-06 19 views

Respuesta

135

El método detach elimina el fragmento de la interfaz de usuario, pero su estado es mantenido por el administrador de fragmentos. Esto significa que puede reutilizar este fragmento llamando al método attach, con una ViewHierarchy modificada

Eliminar significa que la instancia del fragmento no se puede volver a adjuntar. Tendrá que agregarlo nuevamente a la transacción de fragmento.

Fuente comentario

Se dará cuenta de que cuando se separa un fragmento, sus métodos onPause, OnStop y onDestroyView se llaman solamente (en ese orden). Por otro lado, cuando se elimina un Fragmento, se llaman sus métodos onPause, onStop, onDestroyView, onDestroy y onDetach (en ese orden). Del mismo modo, al adjuntar, solo se llaman los métodos onCreateView, onStart y onResume del Fragmento; y al agregar, se invocan los métodos onAttach, onCreate, onCreateView, onStart y onResume del Fragmento (en ese orden). - Adil Hussain

+134

Para agregar a la respuesta de Rajdeep, observará que cuando un 'Fragment' está _detached_, sus métodos' onPause', 'onStop' y' onDestroyView' se llaman solo (en ese orden). Por otro lado, cuando un 'Fragment' es _removed_, se llaman sus métodos' onPause', 'onStop',' onDestroyView', 'onDestroy' y' onDetach' (en ese orden). De forma similar, cuando _attaching_, los métodos 'onCreateView',' onStart' y 'onResume' del' Fragment' son llamados solamente; y cuando _adding_, los métodos 'onAttach',' onCreate', 'onCreateView',' onStart' y 'onResume' del' Fragment' se llaman (en ese orden). –

+0

Hay una rápida sesión de preguntas y respuestas con Diane Hackborn [aquí] (https://groups.google.com/forum/#!topic/android-platform/QlkLMsncDwg). ¿Por qué tengo [este] (http://stackoverflow.com/questions/18238214/stop-oncreateoptionsmenu-to-belements-from-detached-fragment) log? ¿Cómo sabes que se ha llamado a FT.detach()? – Poutrathor

+0

¿Cuál es el beneficio de uno sobre el otro? Quiero saber un caso de uso cuando uno es favorable sobre el otro? Siempre agrego y elimino, ¿es malo? –

44

La denominación de los métodos de administración de fragmentos es muy confusa incluso según los ingenieros de Google en los tableros de mensajes (ver comentarios más arriba). Me hice una pequeña demostración para descubrir cómo funcionan las cosas en realidad. Aquí están mis hallazgos. Siéntete libre de corregirme si estoy equivocado.

Para agregar inicialmente un Fragmento a una Actividad, usa: getFragmentManager(). BeginTransaction(). Add (R.id.container, mFragment) .commit().

Esto asocia la Actividad con el Fragmento y también asocia una Vista con el Fragmento.

Éstos son los eventos del ciclo de vida resultantes y otros valores de retorno método importante:

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

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

para eliminar un fragmento de una actividad, que utilice:. getFragmentManager() beginTransaction() quitar (mFragment).. cometer().

Esto elimina cualquier asociación con una Vista o una Actividad.

Éstos son los eventos del ciclo de vida que resultan y otros valores de retorno método importante:

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

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

que volver a agregar el fragmento aquí

Para separar un fragmento añadido de una actividad, que utilice: getFragmentManager() .beginTransaction(). detach (mFragment) .commit().

Esto elimina cualquier asociación con una Vista, pero mantiene la asociación con la Actividad.

Éstos son los eventos del ciclo de vida resultantes y otros valores método importante de retorno:

onPause()        
onStop()        
onDestroyView()      

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

Para volver a colocar un fragmento que fue separado de la actividad, que utilice:. getFragmentManager() BeginTransaction(). attach (mFragment) .commit().

Esto crea una nueva Vista para asociar con el Fragmento y mantiene la asociación de Actividad.

Éstos son los eventos del ciclo de vida resultantes y otros valores de retorno método importante:

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

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

otras cosas importantes a tener en cuenta: Si extrae un fragmento y luego intenta agregar de nuevo utilizando add() en lugar de attach(), nada parece cambiar.

si intenta agregar un Fragmento que se ha eliminado con remove() utilizando attach() en lugar de add(), nada parece cambiar.

Cuando getView() devuelve nulo, el fragmento puede tener referencias internas a la última vista creada. Esta vista ya no es válida y no debe usarse.

+0

Buen trabajo. Pero me pareció bastante interesante intentar reacoplar y volver a agregar, tener el mismo efecto después de eliminar el fragmento. – zgulser

+1

Así que resultó que "attach()" no invocará a Attack(). "detach()" no invocará enDetach(). –

Cuestiones relacionadas