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é en haut (donc il se chevauche).
Lorsque je clique en arrière, le premier fragment s'affiche correctement (sans le second), mais les deux sont initialement visibles (je ne souhaite que le dernier).
Qu'est-ce que j'oublie ici?
Vous faites deux choses fausses ici:
Vous ne pouvez pas remplacer un fragment placé de manière statique dans un fichier de mise en forme xml
. Vous devez créer un conteneur (par exemple, une FrameLayout
) dans la présentation, puis ajouter le fragment par programmation à l'aide de FragmentTransaction
.
FragmentTransaction.replace
attend l'identifiant du conteneur qui contient le fragment et non l'identifiant du fragment en tant que premier paramètre. Donc, vous devriez 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.
J'avais un problème similaire, mais mon problème était que j'utilisais deux gestionnaires de fragment différents: Un de getSupportFragmentManager()
et un de getFragmentManager()
. Si j'ajoutais un fragment avec SupportFragmentManager
et tentais de remplacer le fragment par FragmentManager
, le fragment serait simplement ajouté par-dessus. Je devais changer le code de sorte que la même FragmentManager
soit utilisée et que le problème soit réglé.
Le site de développement Android suggère l'utilisation d'une 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. Donc, il ne peut 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 à travers votre programme:
http://developer.Android.com/training/basics/fragments/fragment-ui.html
J'ai eu le même problème et j'ai vu toutes les réponses, mais aucune d'entre 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é conteneur de la manière suivante:
<FrameLayout
Android:id="@+id/fragment_frame_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<fragment
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:name="....ShopFragment"
Android:id="@+id/fragment"
tools:layout="@layout/fragment_shop" />
</FrameLayout>
après cela, bien que je passais de la FrameLayout
à la fragmentTransaction.replace()
mais que 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 fichier xml et en l'affichant par programme dans la méthode onCreate()
de l'activité conteneur pour l'aperçu par défaut au début du programme, comme suit:
fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_frame_layout,new ShopFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
et l'activité conteneur xml:
<FrameLayout
Android:id="@+id/fragment_frame_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
Vous pouvez effacer backStack avant de remplacer des fragments:
FragmentManager fm = getActivity().getSupportFragmentManager();
for (int i = 0; i < fm.getBackStackEntryCount(); i++) {
fm.popBackStack();
}
// replace your fragments
Dans Oncreate ()
BaseFragmentloginpage fragment = new BaseFragmentloginpage();
Android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, fragment);
fragmentTransaction.isAddToBackStackAllowed();
fragmentTransaction.commit();
maintenant ce sera toujours votre fragment par défaut ... si vous ajoutez un fragment dans une présentation XML, il se superposera toujours, donc définissez le contenu initial avec fragment au moment de l'exécution
Merci à Sapan Diwakar et aux autres. Cette réponse m'a aidé. J'ai simplement créé un RelativeLayout sans fragment, utilisé celui-ci en tant que vue parent ou groupe, spécifié cette vue groupe dans la transaction à remplacer et tout fonctionnait.
Code: GetSupportFragmentManager (). BeginTransaction () .replace (R.id.content_group_view, itemDetailFragment) .commit ();
Disposition:
<RelativeLayout
Android:id="@+id/content_group_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
</RelativeLayout>
j'ai eu le même problème après avoir utilisé ce problème résolu
Prenez la mise en page où vous remplacez votre fragment
<FrameLayout
Android:id="@+id/fragment_place"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
et code pour le remplacement
public void selectFrag(View view) {
Fragment fr;
if(view == findViewById(R.id.button2))
{
fr = new FragmentTwo();
}else {
fr = new FragmentOne();
}
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
si vous voulez un exemple complet, je vous enverrai un commentaire, parlez-moi ......
J'avais aussi le même problème, mais c'était parce que je n'avais pas changé la couleur de fond du fragment que j'essayais d'ajouter à mon framelayout.
Essayez de faire ceci, avec layout_height
et layout_width
réglés sur match_parent
Une fois, j'ai eu ce problème et j'ai découvert que c'était parce que j'avais accidentellement supprimé l'attribut Android:background
qui manque sur votre code XML. Je pense que cela fonctionne comme lorsque vous peignez un mur, Android:background
est la couleur que le mur sera et les autres vues sont placées au-dessus de la couleur de base. Si 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.
Je suis d'accord avec la réponse de Sapan Diwakar. Mais j'ai trouvé un moyen de contourner le problème.
Tout d’abord, dans votre activité (par exemple activity_main
), où vous avez toutes les présentations, ajoutez une FrameLayout
. Sa hauteur et sa largeur devraient être match parent
. En outre, donnez-lui une id
.
Maintenant, dans votre fragment qui va remplacer la présentation actuelle, appelez onPause()
et onResume()
. Initialisez tous les conteneurs intérieurs dans View
. Et réglez leurvisibility
surGONE
DANS onResume()
etVISIBLE
DANS onPause()
.
NOTE: Pas la FrameLayout
que vous remplacez par ce fragment.
Supposons que vous ayez ViewPager
, TabLayout
, ImageView
et un <fragment>
personnalisé dans activity_main.xml
. Ajoutez une FrameLayout
comme mentionné ci-dessus.
Dans abcFragment.Java
, dans la fonction onClick()
, ajoutez addToBackstack(null)
dans transaction
.
Exemple de code:
dans xyzFragment, qui va remplacer abcFragment (et tout ce qui est présenté dans activity_main.xml), faites ceci
@Override
public void onResume() {
super.onResume();
// On resume, make everything in activity_main invisible except this fragment.
slidingTabs = getActivity().findViewById(R.id.sliding_tabs);
viewPager = getActivity().findViewById(R.id.pager);
miniPlayerFragment = getActivity().findViewById(R.id.mini_pager);
slidingTabs.setVisibility(View.GONE);
viewPager.setVisibility(View.GONE);
miniPlayerFragment.setVisibility(View.GONE);
}
@Override
public void onPause() {
super.onPause();
// Make everything visible again
slidingTabs = getActivity().findViewById(R.id.sliding_tabs);
viewPager = getActivity().findViewById(R.id.pager);
miniPlayerFragment = getActivity().findViewById(R.id.mini_pager);
slidingTabs.setVisibility(View.VISIBLE);
viewPager.setVisibility(View.VISIBLE);
miniPlayerFragment.setVisibility(View.VISIBLE);
}
Bonne codage!
Vous pouvez utiliser la méthode setTransition de FragmentTransaction pour résoudre un problème qui se chevauche.
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Utiliser un conteneur au lieu d'utiliser fragment
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:text="Hello World!" />
Maintenant dans MainActivity
if(condition)
getFragmentManager().beginTransaction().replace(R.id.container,new FirstFragment()).commit();
else
getFragmentManager().beginTransaction().replace(R.id.container, new SecondFragment()).commit();
Veuillez noter que votre classe de fragments doit importer "Android.app.Fragment" Assurez-vous d'utiliser les implémentations "support.v4" ou "originale" et de ne pas les mélanger. Je devenais ce problème parce que je les avais mélangés.