2012-01-07 20 views
44

Activity layout picture¿Cómo volver a abrir la pila para la actividad con múltiples fragmentos?

asume que tienen una actividad que contiene dos FrameLayouts (llamémosles TramaA y FrameB) que a su vez cada uno contienen un fragmento (llamémosles FragmentA1 y FragmentB1 respectivamente). Ahora, cometo una serie de transacciones de fragmentos individuales usando un código similar al siguiente ...

getFragmentManager() 
.beginTransaction() 
.replace(frameId, fragment) 
.addToBackStack(null) 
.commit(); 

... de tal manera que sustituyo FragmentA1 en TramaA con FragmentA2, entonces puedo reemplazar FragmentB1 en FrameB con FragmentB2, entonces yo reemplace FragmentA2 en FrameA con FragmentA3, luego reemplace FragmentB2 en Frame2 con FragmentB3, y el estado final se parece a la imagen de arriba (donde solo están visibles FragmentA3 y FragmentB3).

Si entendí correctamente cómo funciona la pila trasera, al presionar 'atrás' intercalaré el reventado de los Fragmentos entre FrameA y FrameB (lo que refleja cómo los agregué).

¿Alguien sabe si es posible abrir la última transacción en FrameA o FrameB selectivamente? (Es decir, si he pulsado 'Pop TramaA', entonces TramaA sería la transición de vuelta de FragmentA3 a FragmentA2 y, en cambio, si Pressed Pop FrameB ', entonces FrameB sería la transición de vuelta de FragmentB3 a FragmentB2)

Suplemento: Sé que puedo obtener el Fragmento agregado por última vez a un FrameLayout determinado utilizando el método FragmentManager.findFragmentById(int framelayoutId), pero llamar al FragmentTransaction.remove(fragment).commit() solo elimina el Fragmento de la Vista y no hace la transición de vuelta al Fragmento que se mostró previamente.

+1

Si FragmentTransaction.remove "sólo elimina el fragmento de la vista y no la transición de la vista", entonces lo que se muestra en ¿la vista? Pero puedo ver por qué esto podría causar confusión si el Mgr mantiene una sola pila de fragmentos pero no sabe cuáles son visibles simultáneamente, es decir, cómo sabría que A2 está "debajo" de A3 cuando B2 podría estar entre ellos en el ¿apilar? – gordonwd

+0

Si a una Vista (FrameLayout en mi caso) se le han agregado múltiples Fragmentos usando el método 'FragmentTransaction.add (int, Fragment)', entonces llamando a 'FragmentTransaction.remove (Fragment) .commit()' Creo que saldrá del FrameLayout que muestra el Fragmento agregado por última vez. Sin embargo, agregar Fragmentos a la Vista usando el método 'FragmentTransaction.replace (int, Fragment)' (como lo estoy haciendo, suponiendo que esto es mejor para la memoria ?!) dejará FrameLayout sin elementos secundarios (es decir, se mostrará como una Vista vacía) ... –

+0

Para agregar a mi comentario anterior: Puedo ver que hay algunos métodos útiles como 'FragmentManager.getBackStackEntryAt (int index)', 'FragmentManager.popBackStack (String name, int flags) ',' popBackStack (int id, int flags) ',' FragmentTransaction.addToBackStack (String name) 'y' FragmentTransaction.replace (int containerViewId, Fragment fragmento, String tag) ', simplemente no estoy seguro cómo agruparlos para lograr lo que necesito ... –

Respuesta

22

Básicamente, no, solo hay una pila de respaldo para una actividad.

Tan solo tendrá que implementar sus propios back stacks separados.

A partir de Android 4.0 (y la biblioteca de soporte asociado) hay API que deberían hacer esto relativamente fácil - FragmentTransaction.detach(Fragment) le permite poner un fragmento en el mismo estado que está cuando está en la pila posterior, y FragmentManager.saveFragmentInstanceState(Fragment) le permite ir más allá y tirar por completo el objeto Fragment. No es coincidencia, estos se utilizan para implementar FragmentPagerAdapter de ViewPager y FragmentStatePagerAdapter, respectivamente, por lo que puede ver el código de estos como un ejemplo de cómo usarlos.

+0

Gracias por la respuesta Hackbod. Tuve que avanzar con lo que sabía, así que implementé una solución en la que estoy ocultando el Fragmento A1 antes de agregar (en lugar de reemplazar) el Fragmento A2 encima y luego mostrar el Fragmento A1 nuevamente cuando se elimina el Fragmento A2. Me funciona, pero definitivamente implementaré mis propios backstacks como describiste en futuros proyectos o si surgen comportamientos no deseados en el presente: - Gracias de nuevo. –

Cuestiones relacionadas