Android onConfigurationChanged: cómo guardar y restaurar fragmento de la pila trasera?

Tengo una actividad con un panel dual: una lista de elementos de menú a la izquierda (fragmento M) y detalles del elemento seleccionado actualmente a la derecha (fragmento D).

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

Mi problema es: ¿cómo puedo guardar y restaurar la pila trasera de fragmento completo en 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 de esto durante mis búsquedas en Google y Stack Overflow. Si he perdido algún puesto relevante, póngase en contacto conmigo.

Sé que podría simplemente agregar el android:configChanges="orientation|screenSize" a mi actividad para evitar la recreación de la actividad, pero simplemente no puedo hacer eso.

La razón por la que no puedo hacer eso es que estoy usando la barra de acción Sherlock (vers. 4) para la compatibilidad hacia atrás y que el componente necesita recreación de actividad para comportarse correctamente en el cambio de configuración, AFAIK.

Si hay otra manera de recrear el componente Sherlock de Action Bar sin destruir y volver a crear la actividad, avísame.

Gracias por adelantado.

Yo era capaz de hacer esto mediante la caché de los fragmentos, ya que los agregó en mi propia ArrayList. A continuación, establezco un OnBackStackChangedListener para realizar un seguimiento de cuál fue mostrado y pop de la ArrayList según sea necesario.

Mi propósito era un poco diferente, pero el código a continuación debería ser lo que usted necesita para lo que usted describe. Las etiquetas son así que usted puede tener varias pilas traseras si usted necesita. No compilará como está (he cortado gran cantidad de mi propio código) pero debería darte una idea de cómo lo hice. Renuncia adicional: Acabo de conseguir este trabajo y puede haber problemas que no he golpeado todavía.

  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 usted querrá donde su actividad se vuelve a crear 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 oyente del backstack:

  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.

Barra de Acción Sherlock (ABS) necesitaba recrear la barra de acción como parte de recrear la actividad en ABS 3.x, pero según el comentario @ Jake Wharton , la versión 4 no necesita recreación – puede manejar cambios de orientación. Por lo tanto, establecer android: configChanges = "orientación" y su fragmento de pila de nuevo persistirá.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.