Actividad:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment1 fragment = new Fragment1();
Fragment2 fragment2 = new Fragment2();
transaction.replace(R.id.Fragment1, fragment);
transaction.addToBackStack(null);
transaction.commit();
FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
transaction2.replace(R.id.Fragment1, fragment2);
transaction2.addToBackStack(null);
transaction2.commit();
Código en la vista:
<fragment
android:id="@+id/Fragment1"
android:name="com.landa.fragment.Fragment1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_below="@+id/include1" />
El problema es que el contenido no se reemplaza realmente, se coloca en la parte superior (por lo que se superpone).
Cuando hago clic hacia atrás, el primer fragmento se muestra correctamente (sin el segundo), pero inicialmente ambos son visibles (quiero que solo el último sea visible).
¿Que me estoy perdiendo aqui?
android
android-fragments
Herramienta
fuente
fuente
containerViewId
(en elreplace
método).Respuestas:
Estás haciendo dos cosas mal aquí:
No puede reemplazar un fragmento que está colocado estáticamente en un
xml
archivo de diseño. Debe crear un contenedor (por ejemplo, aFrameLayout
) en el diseño y luego agregar el fragmento mediante programación usandoFragmentTransaction
.FragmentTransaction.replace
espera el id del contenedor que contiene el fragmento y no el id del fragmento como primer parámetro. Por lo tanto, debe pasar el primer argumento como la identificación del contenedor al que agregó el primer fragmento.Puede consultar este enlace para obtener más detalles.
fuente
FrameLayout
como recipiente es mejor que usarLinearLayout
.addTobackStack(..)
al realizar su transacción por primera vez. Esto evitará colocar el contenedor FrameLayout vacío en la pila posterior. Aún podrá navegar de regreso al fragmento que agregó.Tuve un problema similar, pero mi problema fue que estaba usando dos administradores de Fragmentos diferentes: uno desde
getSupportFragmentManager()
y otro desdegetFragmentManager()
. Si agregué un fragmento conSupportFragmentManager
y luego intenté reemplazar el fragmento conFragmentManager
, el fragmento simplemente se agregaría en la parte superior. Necesitaba cambiar el código para queFragmentManager
se usara el mismo y eso solucionó el problema.fuente
El sitio para desarrolladores de Android sugiere el uso de
FrameLayout
para cargar fragmentos dinámicamente en tiempo de ejecución. Ha codificado el fragmento en su archivo xml. Por lo tanto, no se puede eliminar en tiempo de ejecución como se menciona en este enlace:http://developer.android.com/training/basics/fragments/creating.html
este enlace muestra cómo agregar fragmentos a través de su programa:
http://developer.android.com/training/basics/fragments/fragment-ui.html
fuente
Tuve el mismo problema y vi todas las respuestas, ¡pero ninguna de ellas contenía mi error! Antes de intentar reemplazar el fragmento actual, estaba mostrando el fragmento predeterminado en el xml de la actividad del contenedor de esta manera:
después de eso, aunque estaba pasando el
FrameLayout
afragmentTransaction.replace()
pero tuve el problema exacto. mostraba el segundo fragmento encima del anterior.El problema se solucionó eliminando el fragmento del xml y mostrándolo programáticamente en el
onCreate()
método de la actividad del contenedor para la vista previa predeterminada al inicio del programa de esta manera:y la actividad del contenedor xml:
fuente
Puede borrar backStack antes de reemplazar fragmentos:
fuente
Agregue
android:background="?android:windowBackground">
al recipiente en el que reside su fragmento. En mi caso, agregué unFrameLayout
, eso debería ayudar.fuente
Use un recipiente en lugar de usar un fragmento
Ahora en MainActivity
Tenga en cuenta que su clase de fragmento debe importar 'android.app.Fragment' Asegúrese de usar "support.v4" o las implementaciones "originales" y no las mezcle. Tenía este problema porque los había mezclado.
fuente
Estoy de acuerdo con la respuesta de Sapan Diwakar. Pero he encontrado una solución para hacer esto.
Primero, en su actividad (por ejemplo
activity_main
), donde tiene todos los diseños, agregue unFrameLayout
. Su altura y anchura deberían sermatch parent
. Además, dale unid
.Ahora, en su fragmento que va a reemplazar el diseño actual, llame a
onPause()
yonResume()
. Inicialice todos los contenedores internos enView
. Y puesto suvisibility
aGONE
enonResume()
yVISIBLE
enonPause()
.NOTA : No es el
FrameLayout
que está reemplazando con este fragmento.Suponga que tiene
ViewPager
,TabLayout
,ImageView
y una costumbre<fragment>
enactivity_main.xml
. Agregue,FrameLayout
como se mencionó anteriormente.En
abcFragment.java
, enonClick()
función, poneraddToBackstack(null)
entransaction
.Código de ejemplo:
en xyzFragment, que va a reemplazar abcFragment (y todo lo que se muestra en activity_main.xml), haga esto
¡Feliz codificación!
fuente
Puede utilizar el método setTransition de FragmentTransaction para solucionar el problema de superposición.
fuente
En Oncreate ()
ahora este será siempre su fragmento predeterminado ... si agrega un fragmento en el diseño xml, siempre se superpondrá, así que configure el contenido inicial con el fragmento en el tiempo de ejecución
fuente
Tuve el mismo problema después de usar este problema resuelto
Toma el diseño del marco donde estás reemplazando tu fragmento
y código de reemplazo
si quieres un ejemplo completo te enviaré solo comentame ...
fuente
También tuve el mismo problema, pero fue porque no había cambiado el color de fondo del fragmento que estaba tratando de agregar a mi diseño de marcos.
Intente hacer esto, con
layout_height
ylayout_width
establezca enmatch_parent
fuente
Una vez tuve este problema y descubrí que era porque había borrado accidentalmente el
android:background
atributo que faltaba en su código xml. Creo que funciona como cuando estás pintando una pared,android:background
es el color que tendrá la pared y las otras vistas se colocan encima de ese color base. Cuando no pintes la pared antes de colocar tus vistas, estarán encima de lo que ya estaba en esa pared, en tu caso, tu otro fragmento. No sé si eso te ayudará, buena suerte.fuente
He intentado sobre todo el caso e intento solucionar el problema, pero todavía no tengo una solución. No sé por qué no me funciona. Estoy de acuerdo con las respuestas anteriores porque muchos están de acuerdo.
Solo estoy extendiendo la respuesta y a continuación se muestra la forma en que me está funcionando.
Espero que alguien reciba ayuda.
fuente
Gracias a Sapan Diwakar y otros. Esta respuesta me ayudó. Simplemente creé un RelativeLayout sin un fragmento dentro de él, usé RelativeLayout como vista principal o de grupo, especifiqué esa vista de grupo en la transacción para reemplazar y funcionó.
Código:
XML:
fuente
Verifique su ID de diseño de marco y reemplácelo como se muestra a continuación
fuente