web-dev-qa-db-fra.com

Le fragment n'est pas en train d'être remplacé mais mis au-dessus du précédent

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?

85
Tool

Vous faites deux choses fausses ici: 

  1. 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

  2. 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. 

120
Sapan Diwakar

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é.

24
swbandit

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

14
Poonam Anthony

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">
6
Emad

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
3
Michał Z.

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

0
Volverine

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>
0
Craig D

j'ai eu le même problème après avoir utilisé ce problème résolu

  1. 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" />
    
  2. 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 ...... 

0
Sunil

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

0
Swastik Udupa

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.

0
Miguel Pinheiro

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 leurvisibilitysurGONE 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!

0
TheOnlyAnil

Vous pouvez utiliser la méthode setTransition de FragmentTransaction pour résoudre un problème qui se chevauche.

transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
0
Lavakush

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.

0
Vikash Kumar Verma