Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Reemplazar el fragmento superior en la pila trasera

Estoy teniendo muchos problemas con fragmentos de Android … Supongamos que mi pila trasera se ve así

[C] [B] [A] --- 

Presionando el botón de retroceso se desprendería Fragment C y dejando el Fragment B en la parte superior de la pila. Ahora, ¿cómo puedo cambiar el Fragment C por el Fragment D mientras mantengo la pila trasera? Nota, el Fragment B no se puede ver durante la operación.

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

De esta manera, al presionar el botón de retroceso se desprendería el Fragment D y dejaría el Fragment B en la parte superior. Fragment C se quita completamente de la pila.

Añado cada fragmento a la pila como si

 FragmentTransaction ft = manager.beginTransaction(); ft.replace(id, instance, getTag(instance)); ft.addToBackStack(getTag(instance)); ft.commit(); 

Pensé que esto podría lograrse haciendo las mismas llamadas sin addToBackStack , pero acaba de hacer que el Fragment D y el Fragment B superponen.

  • Android Project Fragment Transición lanzando Excepción cuando Build target used Nueva API Nivel 21
  • AsyncTask, Fragmentos, Vistas y Backstacks
  • Detectar el gesto de desplazamiento en fragmento
  • Fragmento con ViewPager dentro de Fragmento y FragmentStatePagerAdapter resultados en Excepción (con ejemplo completo)
  • Android Honeycomb: ¿Cómo cambiar fragmentos en FrameLayout, sin volver a crearlos?
  • Cómo pasar datos entre fragmentos
  • Android: flujo maestro / detallado (panel dual) con 1 actividad
  • Actualizar ViewPager dinámicamente?
  • 2 Solutions collect form web for “Reemplazar el fragmento superior en la pila trasera”

    ¿Has intentado hacer estallar la pila trasera antes de agregar el fragmento D:

     FragmentManager fragmentManager = getFragmentManager(); fragmentManager.popBackStack(); // or popBackStackImmediate(); ft.addToBackStack(<fragmentD>); 

    El fragmentTransaction.replace supone reemplazar todos los Fragments en el FragmentManager, y luego agregar el nuevo. Según Google :

    Esto es esencialmente lo mismo que llamar a remove (Fragment) para todos los fragmentos agregados actualmente que se agregaron con el mismo containerViewId y luego agregar (int, Fragment, String) con los mismos argumentos dados aquí.

    Pero como vemos, no siempre funciona bien.

    (Otra pregunta útil sobre eso: FragmentTransaction no funciona )

    Utilizo el siguiente código (con la ayuda de fragmentManager.getFragments() ):

     int top = getSupportFragmentManager().getFragments().size()-1; while (top > 0 && getSupportFragmentManager().getFragments().get(top) == null) { top--; } getSupportFragmentManager().beginTransaction() .remove(getSupportFragmentManager().getFragments().get(top)) .add(R.id.fragment_container, newfrag).commit(); 

    (Sé que no usé backstack, pero estoy un poco confundido con eso.)

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