¿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?
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
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:
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.
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.
Fragment
está desprendido , susonPause
,onStop
yonDestroyView
métodos se llaman solamente (en ese orden). Por otro lado, cuando unFragment
se retira , susonPause
,onStop
,onDestroyView
,onDestroy
yonDetach
métodos se llaman (en ese orden). Del mismo modo, cuando la fijación , losFragment
'sonCreateView
,onStart
yonResume
métodos se denominan solamente; y cuando la adición de , losFragment
'sonAttach
,onCreate
,onCreateView
,onStart
yonResume
métodos se llaman (en ese orden).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:
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:
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:
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:
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.
fuente