¿Cuál es la diferencia entre separar un fragmento y eliminarlo?

118

En los documentos de Android para FragmentTransaction , noté dos métodos muy similares: detachy remove. Las descripciones de allí no parecen proporcionar mucha información sobre cuándo usar cada uno, y por lo que puedo decir, parecen ser lo mismo.

Entonces, ¿cuáles son las diferencias entre estos dos métodos?

yydl
fuente

Respuestas:

156

El método de separación elimina el fragmento de la interfaz de usuario, pero el administrador de fragmentos mantiene su estado. Esto significa que puede reutilizar este fragmento llamando al método adjuntar, 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 del fragmento.

Comentario fuente

Notarás que cuando se separa un Fragmento, solo se llaman a sus métodos onPause, onStop y onDestroyView (en ese orden). Por otro lado, cuando se elimina un Fragmento, se llaman a sus métodos onPause, onStop, onDestroyView, onDestroy y onDetach (en ese orden). De manera similar, al adjuntar, solo se llaman a los métodos onCreateView, onStart y onResume de Fragment; y al agregar, se llaman a los métodos onAttach, onCreate, onCreateView, onStart y onResume del Fragmento (en ese orden). - Adil Hussain

Rajdeep Dua
fuente
145
Para añadir a la respuesta de Rajdeep, se dará cuenta de que cuando una Fragmentestá desprendido , sus onPause, onStopy onDestroyViewmétodos se llaman solamente (en ese orden). Por otro lado, cuando un Fragmentse retira , sus onPause, onStop, onDestroyView, onDestroyy onDetachmétodos se llaman (en ese orden). Del mismo modo, cuando la fijación , los Fragment's onCreateView, onStarty onResumemétodos se denominan solamente; y cuando la adición de , los Fragment's onAttach, onCreate, onCreateView, onStarty onResumemétodos se llaman (en ese orden).
Adil Hussain
1
Hay un rápido Q & A con Diane Hackborn aquí . Entonces, ¿por qué tengo este registro? ¿Cómo sabe que se ha llamado a FT.detach ()?
Poutrathor
1
¿Cuál es el beneficio de uno sobre el otro? ¿Quiero conocer un caso de uso cuando uno es favorable sobre el otro? Siempre agrego y quito, ¿eso es malo?
Neon Warge
1
Mejor aclaración breve y concisa.
Robotec
55

La denominación de los métodos de gestión de fragmentos es muy confusa incluso según los ingenieros de Google en los foros de mensajes (consulte los comentarios anteriores). Hice una pequeña demostración para descubrir cómo funcionan las cosas. Estos son mis hallazgos. Siéntete libre de corregirme si me equivoco.

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

Esto asocia la actividad con el fragmento y también asocia una vista con el fragmento.

Estos son los eventos de ciclo de vida resultantes y otros valores de retorno de métodos importantes:

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

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

Para eliminar un Fragmento de una Actividad, usa: getFragmentManager (). BeginTransaction (). Remove (mFragment) .commit ().

Esto elimina cualquier asociación con una vista o una actividad.

Estos son los eventos de ciclo de vida resultantes y otros valores de retorno de métodos importantes:

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

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

Volví a agregar el fragmento aquí

Para separar un Fragmento agregado de una Actividad, use: getFragmentManager (). BeginTransaction (). Detach (mFragment) .commit ().

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

Estos son los eventos de ciclo de vida resultantes y otros valores de retorno de métodos importantes:

onPause()                             
onStop()                              
onDestroyView()                      

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

Para volver a adjuntar un Fragmento que se separó de la Actividad, use: getFragmentManager (). BeginTransaction (). Attach (mFragment) .commit ().

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

Estos son los eventos de ciclo de vida resultantes y otros valores de retorno de métodos importantes:

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

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

Otras cosas importantes a tener en cuenta: si separa un Fragmento y luego intenta agregarlo nuevamente usando add () en lugar de adjuntar (), nada parece cambiar.

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

Cuando getView () devuelve nulo, es posible que el Fragmento aún tenga referencias internas a la última Vista que creó. Esta vista ya no es válida y no debe usarse.

Stephen
fuente
1
Buen trabajo. Pero parecía bastante interesante intentar volver a adjuntar y volver a agregar tener el mismo efecto después de que se elimina el fragmento.
salida
9
Así que resultó que "attach ()" no invocará onAttach (). "detach ()" no invocará onDetach ().
KunYu Tsai
1
Y algunos de estos eventos del ciclo de vida pueden cambiar ligeramente si mantiene las transacciones en la pila de actividades.
salida estándar del