FragmentTransaction.remove no tiene efecto

Mi requisito es bastante simple: Tengo un botón que debe reemplazar un FragmentA por FragmentB.

Esto suena fácil y casi funciona, el gran problema es que el fragmento viejo no se quita y el nuevo colocado en la parte delantera de la vieja y que están "vivos" juntos en mi diseño.

Introduzca aquí la descripción de la imagen

El código:

FragmentManager fragMgr = a.getSupportFragmentManager(); Fragment currentFragment = (Fragment) fragMgr.findFragmentById(R.id.fragmentitself); if(currentFragment!=null){ FragmentTransaction fragTrans = fragMgr.beginTransaction(); fragTrans.remove(currentFragment); FragmentB newFragment = new FragmentB(); fragTrans.replace(R.id.fragmentcontainer, newFragment); // I have also tried with R.id.fragmentitself fragTrans.addToBackStack(null); fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); fragTrans.commit(); } 

El diseño:

 <FrameLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:id="@+id/fragmentcontainer"> <fragment android:id="@+id/fragmentitself" android:name="com.WazaBe.MyApp.FragmentA" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> 

Solución

Primero, usted tiene que quitar su fragmento de XML y apenas mantener el envase vacío allí:

 <FrameLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:id="@+id/fragmentcontainer" /> 

A continuación, debe agregar su fragmento com.WazaBe.MyApp.FragmentA del código, es decir, en onCreate() de su actividad principal.

Explicación

Es porque con transacciones manipulas ViewGroup como FrameLayouts que es contenedor para Fragmentos. Pero cuando se coloca el fragmento directamente en el diseño XML, entonces se convierte en parte permanente de la jerarquía View y porque es permanente, no se puede quitar del código.

Una vez que haya arreglado su diseño, la llamada remove() ya no es necesaria – basta con hacer replace()

Si desea colocar un fragmento en un contenedor de vistas (como un Framelayout), debe asegurarse de que su contenedor está vacío (sólo esto puede poner un fragmento en él) .no se puede reemplazar un fragmento escrito en un archivo XML, usted Debe agregar A en el contenedor por el código JAVA, y cuando no neet id, puede reemplazarlo por B;

En primer lugar, su contenedor es empyt:

 <FrameLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:id="@+id/fragmentcontainer"> </FrameLayout> 

OK, usted puso FragmentA en ella:

  FragmentTransaction fragTrans = fragMgr.beginTransaction(); fragTrans.remove(currentFragment); FragmentA fragA= new FragmentA(); fragTrans.add(R.id.fragmentcontainer, fragA).commit(); 

AHORA, si desea reemplazar:

 FragmentTransaction fragTrans = fragMgr.beginTransaction(); FragmentB newFragment = new FragmentB(); fragTrans.replace(R.id.fragmentcontainer, newFragment); // I have also tried with R.id.fragmentitself fragTrans.addToBackStack(null); fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); fragTrans.commit(); 
  • Dibujo sobre otras aplicaciones en Android
  • Convertir la ubicación en GeoPoint
  • Mostrar una superposición de "ayuda" en un diseño de Android
  • Cómo obtener fechas de la base de datos y comprobar si se solapan?
  • Implementación de un mapa interior
  • Cómo forzar mezcla alfa en un videoview
  • Detección de la superposición de pantalla: cómo manejar esto en una aplicación de superposición de pantalla
  • SetFocus (overlayItem) de ItemizedOverlay no funciona
  • Google Maps Android API v2 Superposición de rutas
  • Superposición de imagen en dos filas en una vista de lista
  • Android - LazyAdapter vistas superpuestas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.