Android Reorder Fragment Backstack

Tengo un número de páginas / fragmentos de la lista en mi cajón de navegación, el usuario es probable que cambie entre estos con frecuencia y quiero que en el backstack para que puedan navegar de nuevo, pero sólo quiero una instancia de cada fragmento en el backstack así Que el usuario no tiene que presionar un número de veces insano para salir de la aplicación. No puedo averiguar cómo efectivamente "reordenar" el backstack "sin que las páginas sean eliminadas.

Actualmente, cuando cambio de página estaba usando este código para cambiar el fragmento y asegúrese de que sólo está en la pila trasera una vez

if (mFragMgr == null) { mFragMgr = getSupportFragmentManager(); } String backStateName = fragmentDescriptor.name(); boolean fragmentPopped = mFragMgr.popBackStackImmediate(backStateName, 0); if (!fragmentPopped){ mFragMgr.beginTransaction() .remove((Fragment) mFragment) .replace(R.id.content_frame, (Fragment) mFragment) .addToBackStack(backStateName) .commit(); } 

Yo uso este código en onBackPressed

  @Override public void onBackPressed() { if (mFragMgr.getBackStackEntryCount() > 0) { mFragMgr.popBackStackImmediate(); } else { super.onBackPressed(); } } 

Esto funciona, pero significa que elimina las páginas que no quiero eliminar. Ejemplo:

Cuando mi usuario visita 6 páginas en el orden A > B > C > D > E > C porque estoy haciendo una eliminación esperaba la pila siguiente:

  [E] [C] [D] [D] [E] [C] [C] [C] [D] [B] [B] [B] [B] [B] [A] -> [A] -> [A] -> [A] -> [A] -> [A] 

Pero lo que realmente se obtiene es el siguiente – se despliega todo hasta el elemento que coincide con el nombre, esto es independientemente de si incluyo el ".remove (Fragmento) mFragment)" o no – ( Ya he dado cuenta ahora que Eliminar no está afectando a la backstack, por lo que no hay necesidad de señalar que fuera ):

  [E] [D] [D] [C] [C] [C] [C] [B] [B] [B] [B] [B] [A] -> [A] -> [A] -> [A] -> [A] -> [A] 

Si no utilizo un nombre y en lugar de otro uso null al agregar a la backstack consigo lo siguiente:

  [C] [E] [E] [D] [D] [D] [C] [C] [C] [C] [B] [B] [B] [B] [B] [A] -> [A] -> [A] -> [A] -> [A] -> [A] 

¿Cómo puedo obtener el comportamiento que espero? ¿Es posible en absoluto o voy a necesitar registrar los cambios yo mismo y saltar el backstack por completo?

No hay API para hacer esto, pero becuse me preguntaba lo mismo la semana pasada,
Lo tomé como un ejercicio y lo implementé yo mismo.

Mi método permite que usted quite un Fragment de dondequiera en el backstack y esto se alcanza usando refrection para modificar las variables internas que almacenan la información del backstack en FragmentManagerImpl y BackStackRecord .

Hay pocas variables importantes:

  • mBackStack – almacena el BackStackRecord s que contienen la información Fragment , las anteriores, animaciones, etc
  • mActive – todos los Fragment añadidos
  • mAvailBackStackIndices – almacena los índices que pueden ser utilizados por los registros recién insertados, es decir, índices de valores null en mActive
  • y otra

Probado con más de 150 Fragment y no pudo notar ninguna filtración, pero sólo monitoreó el montón en DDMS y no realizó ningún otro análisis de memoria.
Así, porque algo puede ser roto, explorar el código, volver a probarlo, ver si alguien proporciona una mejor respuesta, y repensar si realmente necesita hacer esto en su proyecto.

He subido el código como una esencia en GitHub , espero que ayude.

Cuando desee reutilizar el fragmento antes de él, primero ocultar todos los fragmentos y mostrar el fragmento deseado a la vez. Haciendo esto usted puede reutilizar sus fragmentos sin quitarlos y sin recargar los fragmentos. Pero asegúrese de que antes de implementarlo tiene que agregar el fragmento a backstack.

  • Android - lanzador y comportamiento de la pila trasera
  • La presión no regresa al fragmento anterior
  • ¿Cómo reemplazar el fragmento C con el fragmento A cuando se pulsa el botón Atrás?
  • PopBackStack pero mantener el primer fragmento en android
  • Borrar la pila trasera cuando el objeto de la aplicación es eliminado por el sistema
  • TaskStackBuilder en PendingIntent no funciona
  • Android: abrir la actividad sin guardar en la pila
  • Detener fragmento de ser recreado después de reanudar?
  • Cómo averiguar si la actividad es la última actividad en la pila
  • Fragmento que no llama onPause o onStop cuando se usa replace
  • Borrar actividad back stack
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.