2012-04-03 19 views
8

Tengo una actividad con un panel doble: una lista de elementos de menú a la izquierda (fragmento M) y detalles del elemento seleccionado actualmente a la derecha (fragmento D).Android onConfigurationChanged: cómo guardar y restaurar el fragmento de la pila de nuevo?

Cuando el usuario selecciona un elemento en el fragmento D, el fragmento D se reemplaza por otro fragmento (llamémoslo D1). Cuando el usuario selecciona un elemento en el fragmento D1, el fragmento D1 se reemplaza por otro fragmento (llamémoslo D2), y así sucesivamente. Por supuesto, cuando el usuario presiona el botón Atrás, puede retroceder en el historial de fragmentos: D2-> D1-> D.

Mi problema es: ¿cómo puedo guardar y restaurar la pila completa de fragmentos tras el cambio de configuración (en particular, en la orientación de la pantalla)?

Me parece muy extraño que nadie más haya tenido este problema antes, pero no encontré nada al respecto durante mis búsquedas en Google y Stack Overflow. Si me perdí una publicación relevante, por favor dirígeme a ella.

Sé que podría simplemente agregar el atributo android:configChanges="orientation|screenSize" a mi actividad para evitar actividades recreativas, pero simplemente no puedo hacer eso.

La razón por la que no puedo hacer eso es porque estoy usando Action Bar Sherlock (vers. 4) para compatibilidad con versiones anteriores y ese componente necesita actividades de recreación para comportarse correctamente al cambiar la configuración, AFAIK.

Si hay otra forma de volver a crear el componente Action Bar Sherlock sin destruir y volver a crear la actividad, hágamelo saber.

Gracias de antemano.

Respuesta

0

Action Bar Sherlock (ABS) necesitaba recrear la barra de acciones como parte de la recreación de la actividad en ABS 3.x, pero según @Jake Wharton's comment, la versión 4 no necesita recreación, puede manejar cambios de orientación. Entonces, establece android: configChanges = "orientation" y tu pila de fragmentos de fragmentos persistirá.

+1

@ Iarham1 Gracias por su respuesta, pero, desafortunadamente, ABS 4 todavía tiene algunos problemas en algunas versiones del sistema operativo (por ejemplo, 2.3.7) cuando se establece android: configChanges = "orientation", como se describe en [número 279] (https://github.com/JakeWharton/ActionBarSherlock/issues/279#issuecomment-4934511), por lo que esta no es una solución viable, en este momento. Espero que Jake Wharton lo solucione en un futuro próximo, pero, mientras tanto, ¿usted o alguien más sabe cómo guardar y restaurar el conjunto completo de fragmentos al cambiar la configuración? ¿O alternativamente, cómo ajustar el código ABS para recrear programáticamente solo ABS en el cambio de configuración? – Luke

5

Pude hacer esto guardando en caché los Fragmentos como los agregué en mi propia ArrayList. Luego configuré OnBackStackChangedListener para realizar un seguimiento de cuál se mostró y desconectar ArrayList según sea necesario.

Mi propósito era un poco diferente, pero el código siguiente debe ser el que necesita para lo que describe. Las etiquetas son para que pueda tener múltiples pilas traseras si lo necesita. No compilará como está (he recortado un montón de mi propio código), pero debería darle una idea de cómo lo hice. Descargo de responsabilidad adicional: I acaba de tengo este trabajo y puede haber problemas que aún no he alcanzado.

public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag) 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.detach(visibleFragment); 
     ft.add(R.id.realtabcontent, fragment, tag); 
     ft.attach(fragment); 
     ft.addToBackStack(null); 
     manualBackStacks.get(tag).add(fragment); 
     ft.commit(); 
     this.getSupportFragmentManager().executePendingTransactions(); 
    } 

El código que querrá donde su actividad se regenere después de un cambio de orientación:

ArrayList<Fragment> backStack = 
     new ArrayList<Fragment>(manualBackStacks.get(tag)); 
popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote 
for (int bs = 1; bs < backStack.size(); bs++) { 
    replaceFragmentWithBackStackForTag(backStack.get(bs), tag); 
} 

El backstack oyente:

public void onBackStackChanged() { 
    int index = getSupportFragmentManager().getBackStackEntryCount(); 
    ArrayList<Fragment> backStack = manualBackStacks.get(tag); 
    visibleFragment = backStack.get(index); 
    // Pop the last element if we've backed up. 
    popArrayListToIndex(backStack, index); 
} 

Espero que esto ayude.

+0

Estoy muy interesado en este enfoque, pero no creo que su respuesta brinde suficientes detalles para que pueda entenderlo fácilmente. ¿Puedes agregar más detalles a tu respuesta? – deepwinter

+0

¡Compruébelo de esto, gracias! – deepwinter

Cuestiones relacionadas