Estoy convirtiendo una aplicación para usar fragmentos usando la biblioteca de compatibilidad. Ahora actualmente tengo una serie de actividades (ABCD) que se encadenan entre sí, D tiene un botón 'OK' que, cuando se presionan las llamadas, finaliza y luego emerge onActivityResult()
para destruir adicionalmente C y B.
Para mi versión previa del fragmento Honycomb, cada actividad es efectivamente un contenedor de fragmentos Af Bf Cf Df. Todas las actividades se inician a través de startActivityForResult()
y onActivityResult()
dentro de cada uno de los fragmentos pueden llamar felizmentegetActivity().finish()
Sin embargo, el problema que tengo es que en mi versión Honeycomb solo tengo una actividad, A, y los fragmentos Bf, Cf, Df se cargan usando el FragmentManager
.
Lo que no entiendo es qué hacer en Df cuando se presiona 'OK' para eliminar los fragmentos Df, Cf y Bf.
Intenté que el fragmento saliera de la pila, pero esto resultó en una excepción. onActivityResult()
es inútil porque no he cargado el fragmento usando startActivityForResult()
.
¿Estoy pensando en esto completamente de la manera incorrecta? ¿Debo implementar algún tipo de escucha que se comunique con el fragmento o la actividad principal para hacer el pop usando el administrador de transacciones?
Respuestas:
Paso # 1: ¡Df dile a D "yo! ¡Tenemos el clic OK!" llamando a un método, ya sea en la actividad en sí o en una instancia de interfaz proporcionada por la actividad.
Paso # 2: Haz que D elimine los fragmentos a través de
FragmentManager
.La actividad de alojamiento (D) es la que sabe qué otros fragmentos hay en la actividad (frente a estar en otras actividades). Por lo tanto, los eventos en fragmentos que pueden afectar la mezcla de fragmentos deben propagarse a la actividad, lo que hará los movimientos de orquestación apropiados.
fuente
finish()
debería ser suficiente.onDestroy()
método a su fragmento y vea si se llama.Si bien podría no ser el mejor enfoque, el equivalente más cercano que puedo pensar que funciona es esto con la biblioteca de compatibilidad / soporte
o
de otra manera.
Además, puede usar el backstack y abrirlo. Sin embargo, tenga en cuenta que el fragmento podría no estar en el backstack (dependiendo de la transacción del fragmento que lo llevó allí ...) o podría no ser el último que entró en la pila, por lo que al extraer la pila podría eliminar el incorrecto ...
fuente
Puede usar el siguiente enfoque, funciona bien:
fuente
popBackStack()
es la única solución que funciona cuando desea volver a establecer el título de la barra de acción al estado anterior después de eliminar el fragmento. De lo contrario, no necesitaría combinar las dos soluciones de alta calificación de stackoverflow.com/questions/13472258/… y esta solución aquí para establecer siempre el título de barra de acción adecuado después de varios casos de uso. como volver a presionar, eliminar, agregar reemplazar, etc.Debes dejar que la actividad se ocupe de agregar y quitar fragmentos, como dice CommonsWare, usa un oyente. Aquí hay un ejemplo:
fuente
En la Actividad / AppCompatActivity:
y luego llame al fragmento:
o como se indica en otras respuestas, llame a esto en el fragmento:
fuente
Si está utilizando el nuevo componente de navegación, es simple como
Hará toda la FragmentTransaction detrás de usted.
fuente
Vea si sus necesidades son satisfechas por un DialogFragment. DialogFragment tiene un método de despido (). Mucho más limpio en mi opinión.
fuente
Creo un método simple para eso
Que colocarlo en mi clase ActivityUtils
Es un gran trabajo, diviértete!
fuente
OnCreate:
Así es como oculto el fragmento en el evento de clic 1
Luego lo muestra de vuelta int evento 2
fuente
Si necesita retroceder desde el cuarto fragmento en el historial de backstack hasta el primero, ¡use etiquetas!
Cuando agrega el primer fragmento, debe usar algo como esto:
o
Y cuando quieres mostrar los Fragmentos B, C y D, usas esto:
y otras letras ...
Para volver a
Fragment
A, simplemente llamepopBackStack(0, "A")
, sí, use el indicador que especificó cuando lo agregó, y tenga en cuenta que debe ser el mismo indicador en el comandoaddToBackStack()
, no el que se usa en el comando reemplazar o agregar.De nada ;)
fuente
Para cerrar un fragmento dentro del mismo fragmento
fuente
¿Por qué no solo:
getActivity (). finish ();
fuente