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
- ¿Cómo manejar el botón de nuevo utilizando el buscapersonas?
- Android ¿Cómo puedo "saltar a otra sucursal" en la pila de atrás de la actividad "árbol"?
- Android: borra todas las actividades del backstack y termina la actividad actual
- El fragmento que se obtiene de backstack, llama onCreateView () de nuevo
- ¿Cómo excluir de una actividad exportada?
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?
- Fragmento de Android objeto nulo mNextAnim Crach interno
- Android: Fragmento de diálogo y problemas de Backstack
- Quitar fragmento medio de FragmentStack
- Fragmento de transacción no funciona cuando se utiliza AppCompatActivity o FragmentActivity
- Navegación de nuevo a FragmentPagerAdapter -> fragmentos están vacíos
- Intent.FLAG_ACTIVITY_CLEAR_TOP no funciona
- Android: BackStack se comporta mal, si la aplicación se inició desde otra aplicación
- Problemas con Android Fragment pila trasera
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 elBackStackRecord
s que contienen la informaciónFragment
, las anteriores, animaciones, etc -
mActive
– todos losFragment
añadidos -
mAvailBackStackIndices
– almacena los índices que pueden ser utilizados por los registros recién insertados, es decir, índices de valoresnull
enmActive
- 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.
- Cómo comprobar la base de datos en el dispositivo Android no enraizada
- Catch onTouch evento por el padre, manejarlo y pasar a los niños