Activité:
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();
Code dans la vue:
<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" />
Le problème est que le contenu n'est pas vraiment remplacé - il est placé au-dessus (donc il se chevauche).
Lorsque je clique en arrière, le premier fragment s'affiche correctement (sans le second), mais initialement les deux sont visibles (je veux que seul le dernier soit visible).
Qu'est-ce que j'oublie ici?
containerViewId
(dans lareplace
méthode).Réponses:
Vous faites deux choses mal ici:
Vous ne pouvez pas remplacer un fragment placé de manière statique dans un
xml
fichier de modèle. Vous devez créer un conteneur (par exemple aFrameLayout
) dans la mise en page, puis ajouter le fragment par programme en utilisantFragmentTransaction
.FragmentTransaction.replace
attend l'ID du conteneur qui contient le fragment et non l'ID du fragment comme premier paramètre. Vous devez donc passer le premier argument en tant qu'ID du conteneur auquel vous avez ajouté le premier fragment.Vous pouvez vous référer à ce lien pour plus de détails.
la source
FrameLayout
vaut mieux utiliser comme conteneur que d’utiliserLinearLayout
.addTobackStack(..)
lorsque vous effectuez votre transaction pour la première fois. Cela évitera de placer le conteneur FrameLayout vide sur la pile arrière. Vous pourrez toujours revenir au fragment que vous ajoutez.J'ai eu un problème similaire, mais mon problème était que j'utilisais deux gestionnaires de fragments différents: un de
getSupportFragmentManager()
et un degetFragmentManager()
. Si j'ajoutais un fragment avecSupportFragmentManager
et que j'essayais de remplacer le fragment parFragmentManager
, le fragment serait simplement ajouté par-dessus. J'avais besoin de changer le code pour que le mêmeFragmentManager
soit utilisé et cela a réglé le problème.la source
Le site des développeurs Android suggère l'utilisation d'un
FrameLayout
pour charger des fragments de manière dynamique au moment de l'exécution. Vous avez codé en dur le fragment dans votre fichier xml. Il ne peut donc pas être supprimé au moment de l'exécution comme mentionné dans ce lien:http://developer.android.com/training/basics/fragments/creating.html
ce lien montre comment ajouter des fragments via votre programme:
http://developer.android.com/training/basics/fragments/fragment-ui.html
la source
J'ai eu le même problème et j'ai vu toutes les réponses, mais aucune d'elles ne contenait mon erreur! Avant d'essayer de remplacer le fragment actuel, je montrais le fragment par défaut dans le xml de l'activité du conteneur comme ceci:
après cela, même si je passais le
FrameLayout
à lafragmentTransaction.replace()
mais j'ai eu le problème exact. il montrait le deuxième fragment au-dessus du précédent.Le problème résolu en supprimant le fragment du xml et en l'affichant par programme dans la
onCreate()
méthode de l'activité du conteneur pour l'aperçu par défaut au démarrage du programme comme ceci:et l'activité du conteneur xml:
la source
Vous pouvez effacer backStack avant de remplacer les fragments:
la source
Ajoutez
android:background="?android:windowBackground">
au conteneur dans lequel réside votre fragment. Dans mon cas, j'ai ajouté unFrameLayout
, cela devrait aider.la source
Utilisez un conteneur au lieu d'utiliser un fragment
Maintenant dans MainActivity
Veuillez noter que votre classe de fragment doit importer "android.app.Fragment". Assurez-vous que vous utilisez "support.v4" ou les implémentations "originales" et ne les mélangez pas. J'avais ce problème parce que je les avais mélangés.
la source
Je suis d'accord avec la réponse de Sapan Diwakar. Mais j'ai trouvé une solution de contournement sur la façon de procéder.
Tout d'abord, dans votre activité (par exemple
activity_main
), où vous avez toutes les mises en page, ajoutez un fichierFrameLayout
. Sa hauteur et sa largeur devraient êtrematch parent
. Aussi, donnez-lui unid
.Maintenant, dans votre fragment qui va remplacer la mise en page actuelle, appelez
onPause()
etonResume()
. Initialisez tous les conteneurs internes dansView
. Et mettez-lesvisibility
à l'GONE
intérieuronResume()
et à l'VISIBLE
intérieuronPause()
.REMARQUE : pas celui
FrameLayout
que vous remplacez par ce fragment.Supposons que vous ayez
ViewPager
,TabLayout
,ImageView
et une coutume<fragment>
dansactivity_main.xml
. Ajoutez,FrameLayout
comme mentionné ci-dessus.Dans
abcFragment.java
, enonClick()
fonction, ajouteraddToBackstack(null)
àtransaction
.Exemple de code:
dans xyzFragment, qui va remplacer abcFragment (et tout ce qui est affiché dans activity_main.xml), faites ceci
Bon codage!
la source
Vous pouvez utiliser la méthode setTransition de FragmentTransaction pour résoudre le problème de chevauchement.
la source
Dans Oncreate ()
maintenant, ce sera toujours votre fragment par défaut ... si vous ajoutez un fragment dans une mise en page XML, il se chevauchera toujours, alors définissez le contenu initial avec le fragment au moment de l'exécution
la source
J'ai eu le même problème après avoir utilisé ce problème résolu
Prenez la disposition du cadre où vous remplacez votre fragment
et code de remplacement
si vous voulez un exemple complet, je vous enverrai juste un commentaire moi ......
la source
J'ai également eu le même problème, mais c'est parce que je n'avais pas changé la couleur de fond du fragment que j'essayais d'ajouter à ma mise en page.
Essayez de faire ceci, avec
layout_height
etlayout_width
réglez surmatch_parent
la source
Une fois, j'ai eu ce problème et j'ai découvert que c'était parce que j'avais accidentellement supprimé l'
android:background
attribut manquant dans votre code xml. Je pense que cela fonctionne comme lorsque vous peignez un mur,android:background
c'est la couleur du mur et les autres vues sont placées au-dessus de cette couleur de base. Lorsque vous ne peignez pas le mur avant de positionner vos vues, elles seront au-dessus de ce qui était déjà dans ce mur, dans votre cas, votre autre fragment. Je ne sais pas si cela vous aidera, bonne chance.la source
J'ai essayé avant tout le cas et essayé de résoudre le problème mais je n'ai toujours pas trouvé de solution. Je ne sais pas pourquoi ça ne marche pas pour moi. Je suis d'accord avec les réponses ci-dessus car beaucoup sont d'accord avec cela.
Je ne fais qu'étendre la réponse et voici la manière qui fonctionne pour moi.
J'espère que quelqu'un obtiendra de l'aide.
la source
Merci à Sapan Diwakar et aux autres. Cette réponse m'a aidé. J'ai simplement créé un RelativeLayout sans fragment à l'intérieur, utilisé le RelativeLayout comme vue parent ou de groupe, spécifié cette vue de groupe dans la transaction à remplacer, et cela a fonctionné.
Code:
XML:
la source
Vérifiez votre ID de disposition de cadre et remplacez-le comme ci-dessous
la source