Estoy usando la biblioteca de compatibilidad de Android para implementar fragmentos y he extendido la muestra de diseño para que un fragmento contenga un botón que dispara otro fragmento.
En el panel de selección a la izquierda tengo 5 elementos seleccionables - A B C D E
.
Cada uno carga un fragmento (vía FragmentTransaction:replace
) en el panel de detalles:a b c d e
Ahora he extendido el fragmento e
para que contenga un botón que carga otro fragmento e1
también en el panel de detalles. He hecho esto en e
el método onClick del fragmento de la siguiente manera:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Si hago las siguientes selecciones:
E - e - e1 - D - E
Entonces el fragmento e
está en el panel de detalles. Esto está bien y lo que quiero. Sin embargo, si presiono el back
botón en este punto, no hace nada. Tengo que hacer clic dos veces porque e1
todavía está en la pila. Además, después de hacer clic, obtuve una excepción de puntero nulo en onCreateView:
Para 'resolver' este problema, agregué lo siguiente cada vez que A B C D E
se selecciona:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
¿Me pregunto si esta es la solución correcta o si debería estar haciendo algo diferente?
La otra solución limpia si no desea mostrar todas las entradas de la pila ...
Esto limpiará la pila primero y luego cargará un nuevo fragmento, por lo que en cualquier punto tendrá un solo fragmento en la pila.
fuente
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
ante un replace (), ya que se carga el llamado FragmentoonCreateView()
,onActivityCreated()
etc. La restauración y destroing un Fragmento instante es malo. El Fragment puede registrar un receptor, por ejemplo. Esto afecta el rendimiento.FragmentTransaction
? ¿Hay solo un mal rendimiento de la pila de fragmentos incorrecta?Gracias a la respuesta de Joachim , finalmente uso el código para borrar toda la entrada de la pila.
fuente
popBackStack(backStackId, INCLUSIVE)
hará aparecer todos los fragmentos (estados) de nuevo a backStackId, por lo que una vez que aparezca el más bajoi
que va a aparecer, todos los más altos deberían aparecer al mismo tiempo. Entonces, ¿cuál es el punto de un bucle?He investigado mucho para limpiar Backstack, y finalmente veo Transaction BackStack y su administración . Aquí está la solución que mejor funcionó para mí.
El método anterior recorre todas las transacciones en el backstack y las elimina inmediatamente de una en una.
Nota: el código anterior a veces no funciona y me enfrento a ANR debido a este código, así que no intente esto.
El siguiente método de actualización elimina todo el envío de ese "nombre" del backstack.
fuente
Estoy usando un código similar a los que usan el ciclo while pero llamo al recuento de entradas en cada ciclo ... así que supongo que es algo más lento
fuente
Como está escrito en Cómo hacer estallar un fragmento de backstack y por LarsH aquí, podemos hacer estallar varios fragmentos de arriba hacia abajo a una etiqueta específica ( junto con el fragmento etiquetado ) usando este método:
Sustituye "frag" con la etiqueta de tu fragmento. Recuerde que primero debemos agregar el fragmento al backstack con:
Si agregamos fragmentos con
addToBackStack(null)
, no haremos estallar fragmentos de esa manera.fuente
fuente