FragmentTransaction reemplazar no funciona

Ya busqué este problema en stackoverflow y encontré estas dos soluciones:

Sustitución de un fragmento por otro fragmento dentro del grupo de actividad
Fragmento añadir o reemplazar no funciona

Pero mi código parece ser correcto como se puede comprobar a continuación, los comentarios sobre mi código están en Portugues (Brasil):

Esta es mi clase MenuItemReceiver (Sí, utilizo un BroadcastReceiver para mostrar mis fragmentos), esto ya funciona para mostrar el contenido de mi fragmento pero cuando intento reemplazarlo, el fragmento antiguo permanece y el nuevo aparece por encima del antiguo.

public void onReceive(Context context, Intent intent) { //Fragment que será carregado, este fragment foi repassado pelo SlideMenuAdapter ao ter um item clicado Serializable serializableExtra = intent.getSerializableExtra(CustomFragment.CUSTOM_FRAGMENT); //Cast para CustomFragment uma vez que devemos recupera-lo como Serializable, poderia ter dado cast direto, mas decidi manter assim para melhor entendimento do código CustomFragment fragment = (CustomFragment) serializableExtra; FragmentTransaction ft = slideMenuActivity.getSupportFragmentManager().beginTransaction();//Informa que estamos inicando uma transação nova ft.replace(R.id.dashboard,fragment); ft.addToBackStack(null); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); //Aplicamos as alterações permitindo que o estado do fragment seja perdido posteriormente, utilizamos o StateLoss para otimizar //o gerenciamento de memória e garantir que nenhum fragment fique para traz porem sem possibilitado de ser "revisitado" slideMenuActivity.toggle();//Aqui simplesmente estamos escondendo o menu } 

He intentado también con este código y no tengo ninguna diferencia:

  public void onReceive(Context context, Intent intent) { Serializable serializableExtra = intent.getSerializableExtra(CustomFragment.CUSTOM_FRAGMENT); CustomFragment fragment = (CustomFragment) serializableExtra; Fragment oldFragment = slideMenuActivity.getSupportFragmentManager().findFragmentById(R.id.dashboard); FragmentTransaction ft; if(oldFragment!=null){ ft = slideMenuActivity.getSupportFragmentManager().beginTransaction(); ft.remove(oldFragment); ft.commit(); } ft = slideMenuActivity.getSupportFragmentManager().beginTransaction();ft.add(R.id.dashboard,fragment); ft.addToBackStack(null); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); slideMenuActivity.toggle(); } 

Y aquí puedes ver mi diseño de panel:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dashboard" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" > </FrameLayout> 

Tenga en cuenta que fragmentTransaction.replace es (en el momento de escribir este) buggy – consulte https://code.google.com/p/android/issues/detail?id=24674 .

Lo que podrías hacer ahora es

  • Para protagonizar el tema (en el enlace proporcionado) y
  • Llegar a una solución hasta que Google lo ha arreglado.

Mi solución es quitar manualmente todos los fragmentos relevantes (con la ayuda de fragmentManager.getFragments() ) y agregar el nuevo fragmento normalmente con fragmentTransaction.add .

Parece que tienes un problema con OldFragment. En su segundo bloque de código, tiene slideMenuActivity.getSupportFragmentManager().findFragmentById(R.id.dashboard) que implica que oldFragment = R.id.dashboard, y que se agrega en xml. Este método tiene dos problemas:

  1. No puede reemplazar fragmentos que se agregan en xml, solo puede reemplazar los que se agregaron dinámicamente.
  2. Tienes que llamar a replace en el contenedor que tiene el fragmento, no el fragmento en sí. Así que en lugar de llamar a replace(R.id.dashboard, fragment) debe ser replace(R.id.dashboards_container, fragment) .

Además, si está cambiando entre los mismos fragmentos, considere utilizar adjuntar y separar en lugar de reemplazar. Adjuntar y separar sólo destruir la jerarquía de vista, mientras que reemplazar los destruye por completo. Por lo tanto, adjuntar y separar aumentará el rendimiento si está tratando de reutilizar los mismos fragmentos. Vea mi respuesta aquí para un ejemplo de adjuntar / separar .

Parece que el primer bloque de código es correcto. ¿Puede agregar el código en el que agrega dinámicamente el primer fragmento?

Si sólo sucede que usted hace eso en su onCreateView (), podría estar agregando dos veces. El primero será reemplazado correctamente, pero una copia más vieja que fue semi-destruida cuando navegó lejos y volvió a través del Receptor, todavía se mostrará.

  • ¿Puedo añadir AnimationListener para la traducción Fragment?
  • Añadir un fragmento a un diálogo
  • Evitar el siguiente fragmento (pestaña) de la precarga con ViewPager
  • Establecer el título de un SherlockActionBar
  • Fragmento de Android que se comporta raro
  • Cómo reemplazar un fragmento con otro fragmento utilizando el oyente en el primer fragmento
  • Construir Reproducir Interfaz similar a la música
  • ¿Cómo puedo coordinar dos tareas de fondo?
  • Detectar el gesto de desplazamiento en fragmento
  • Fragmentos y receptores de emisión
  • Ocultar barra Tablayout en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.