Porté mi aplicación de Android a Honeycomb e hice una gran refactorización para usar fragmentos. En mi versión anterior, cuando presioné el botón de Inicio, solía hacer un ACTIVITY_CLEAR_TOP
para restablecer la pila de respaldo.
Ahora mi aplicación es solo una Actividad con múltiples fragmentos, así que cuando presiono el botón de Inicio, simplemente reemplazo uno de los fragmentos que contiene. ¿Cómo puedo limpiar mi back stack sin tener que usarlo startActivity
con la ACTIVITY_CLEAR_TOP
bandera?
android
android-fragments
biquillo
fuente
fuente
Respuestas:
Publiqué algo similar aquí
De la respuesta de Joachim, de Dianne Hackborn:
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
Terminé simplemente usando:
Pero igualmente podría haber usado algo como:
Lo que mostrará todos los estados hasta el nombre. Luego puedes reemplazar el fragmento con lo que quieras
fuente
Para responder al comentario de @ Warpzit y facilitar que otros lo encuentren.
Utilizar:
fuente
Con el debido respeto a todas las partes involucradas; Estoy muy sorprendido de ver cuántos de ustedes podrían limpiar todo el back stack del fragmento con un simple
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
De acuerdo con la documentación de Android (con respecto al
name
argumento, el "nulo" en las propuestas de trabajo reclamadas).Ahora, me doy cuenta de que no tengo conocimiento de sus implementaciones particulares (como cuántas entradas tiene en la pila posterior en el momento dado), pero apostaría todo mi dinero en la respuesta aceptada cuando espero una respuesta bien definida comportamiento en una gama más amplia de dispositivos y proveedores:
(para referencia, algo junto con esto)
fuente
Funciona para mí y de manera fácil sin usar loop:
fuente
La respuesta aceptada no fue suficiente para mí. Tuve que usar:
fuente
popBackStackImmediate()
realiza la transacción sincrónicamente, lo cual, en general, es desaconsejable.Backstack claro sin bucles
Donde nombre es el parámetro addToBackStack ()
fuente
Solo quería agregar: -
Saliendo del backstack usando los siguientes
se trata solo de eliminar los fragmentos de la transacción, de ninguna manera va a eliminar el fragmento de la pantalla. Entonces, idealmente, puede que no sea visible para usted, pero puede haber dos o tres fragmentos apilados uno sobre el otro, y al presionar la tecla de retroceso, la IU puede verse desordenada, apilada.
Solo tomando un ejemplo simple: -
Supongamos que tiene un fragmento A que carga Fragmnet B usando fragmentmanager.replace () y luego agregamos AddToBackStack, para guardar esta transacción. Entonces el flujo es: -
PASO 1 -> Fragmento A-> Fragmento B (nos mudamos a Fragmento B, pero el Fragmento A está en segundo plano, no visible).
Ahora realiza un trabajo en el fragmento B y presiona el botón Guardar, que después de guardar debe volver al fragmento A.
PASO 2-> Al guardar FragmentB, volvemos a FragmentA.
PASO 3 -> Entonces, un error común sería ... en el Fragmento B, haremos el fragmento Manager.replace () fragmentB con fragmentA.
Pero lo que realmente está sucediendo es que estamos cargando el Fragmento A nuevamente, reemplazando el Fragmento B. Entonces ahora hay dos FragmentA (uno de STEP-1, y uno de este STEP-3).
Dos instancias de FragmentsA están apiladas una sobre otra, lo que puede no ser visible, pero está ahí.
Entonces, incluso si limpiamos el backstack mediante los métodos anteriores, la transacción se borra pero no los fragmentos reales. Entonces, idealmente en un caso tan particular, al presionar el botón Guardar simplemente necesita volver al fragmento A simplemente haciendo fm.popBackStack () o fm.popBackImmediate () .
Entonces, el Paso 3-> fm.popBackStack () correcto vuelve al fragmento A, que ya está en la memoria.
fuente
Al leer la documentación y estudiar cuál es la identificación del fragmento, parece ser simplemente el índice de la pila, por lo que esto funciona:
Cero (
0
) es la parte inferior de la pila, por lo que al abrirla se borra la pila.CAVEAT: Aunque lo anterior funciona en mi programa, dudo un poco porque la documentación de FragmentManager nunca indica que la identificación es el índice de la pila. Tiene sentido que lo sea, y todos mis registros de depuración revelan que lo es, pero tal vez en alguna circunstancia especial no lo haría. ¿Puede alguien confirmar esto de una forma u otra? Si es así, entonces lo anterior es la mejor solución. Si no, esta es la alternativa:
fuente
fragmentManager..getBackStackEntryAt(0).getId()
lugar de 0? Esto debería funcionar incluso si los identificadores de entrada de backstack son en algún punto diferentes del índice de pila.Uso
fuente
Hola ~ Encontré una solución que es mucho mejor, desde: https://gist.github.com/ikew0ng/8297033
fuente
Tengo esto trabajando de esta manera:
fuente
Está funcionando para mí, prueba este:
fuente
Llamar a este método sería muy bueno.
fuente
fuente