Fragmentos de Android: ¿Cuándo usar ocultar / mostrar o agregar / eliminar / reemplazar?


117

Supongamos que deseo reemplazar el fragmento actual en alguna vista de contenedor con otra. ¿Es mejor usar reemplazar ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... o lo siguiente, con show and hide?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

¿Hay alguna forma de hacer esto más eficiente? No puedo encontrar mucha información sobre cuándo usar estos métodos o cómo afectan el ciclo de vida de los fragmentos involucrados. ¡Gracias!


Si voy al fragmento B del fragmento A y luego vuelvo al fragmento A, ¿cómo puedo asegurarme de que el evento del ciclo de vida, como onCreateView, no se llame al fragmento A? ¿Funciona encontrar fragmento por etiqueta?
blackHawk

Respuestas:


135

Debe considerar lo que planea hacer con el fragmento para decidir qué camino seguir. Si usa FragmentTransaction para ocultar el fragmento, aún puede estar en el estado de ejecución de su ciclo de vida, pero su interfaz de usuario se ha separado de la ventana, por lo que ya no es visible. Por lo tanto, técnicamente aún podría interactuar con el fragmento y volver a adjuntar su interfaz de usuario más tarde si lo necesita. Si reemplaza el fragmento, en realidad lo está sacando del contenedor y pasará por todos los eventos de desmontaje en el ciclo de vida (onPause, onStop, etc.) y si por alguna razón necesita ese fragmento nuevamente, tendrá que hacerlo insértelo de nuevo en el contenedor y déjelo ejecutar de nuevo a través de toda su inicialización.

Si existe una alta probabilidad de que necesite ese fragmento nuevamente, simplemente ocúltelo porque es una operación menos costosa volver a dibujar su diseño que reinicializarlo por completo.


5
Para nuestras necesidades, inicializar el fragmento es bastante caro, ¡así que probablemente vayamos hide()y show()ahorremos en eso! ¡Gracias por esto!
Robert Karl

2
Hola, cuando dices separar de la ventana, ¿quieres decir que se llamará a la devolución de llamada onDetach ()? Experimenté eso, parece que no es el caso.
GingerJim

probablemente quiso decir "desapegarse"; un fragmento también se puede separar / volver a adjuntar (además para agregar / eliminar, mostrar / ocultar)
comeGetSome

1
@Zainodis, yo también tengo el mismo problema. Mi solución es guardar el estado oculto del fragmento en onSaveInstanceState () - SavedInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); luego en onCreate () si (SavedInstanceState! = null) recupera el estado oculto y si el fragmento está oculto, escóndelo con la transacción.
worawee.s

1
@ worawee.s ¡Hola y gracias por la actualización :)! Resolví el problema hace un tiempo por mi parte: realmente no necesitaba ocultar / mostrar, etc., así que lo dejé por completo y ahora voy con estándares como agregar / reemplazar o actividades de fragmentos individuales en un solo panel (flujo de detalles maestros básicamente) . Para aquellos que aún usan hide, su solución será realmente útil, y no marcar SavedInstance! = Null fue uno de los errores que cometí antes.
AgentKnopf

5

Básicamente te respondiste a ti mismo. Si desea reemplazar (por lo que el fragmento antiguo ya no es necesario) úselo replace()si desea ocultarlo temporalmente y luego hágalo hide().


Básicamente, reemplazar elimina todo. No pude encontrar la piel correspondiente Todos :(
AlikElzin-kilaka

@ AlikElzin-kilaka En mi fragmento de actividad 3 en los tres fragmentos, obtengo datos de la red, qué método debo seguir
Mansukh Ahir

0

Usé el método hide / Show en mi actividad con 4 fragmentos, su solución se resolvió, pero en algún momento, al azar, cuando muestro mi cuadro de diálogo, le da una excepción de token de ventana incorrecta cuando utilicé el método de agregar y reemplazar, entonces la excepción de token incorrecto no se produce, así que creo que mostrar / ocultar el método no es perfecto

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.