Android – fragment .replace () ne remplace pas le contenu – le met au premier plan

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:

  

Le problème est que le contenu n’est pas vraiment remplacé – il est mis sur le dessus (de sorte qu’il se chevauche).

Lorsque je clique, le premier fragment est affiché correctement (sans le second), mais les deux sont initialement visibles (je veux seulement que le dernier soit visible).

Qu’est-ce que j’oublie ici?

Vous faites deux choses mal ici:

  1. Vous ne pouvez pas remplacer un fragment placé de manière statique dans un fichier de présentation xml . Vous devez créer un conteneur (par exemple, un FrameLayout ) dans la mise en page, puis append le fragment par programme à l’aide de FragmentTransaction .

  2. FragmentTransaction.replace attend l’identifiant du conteneur qui contient le fragment et non l’identifiant du fragment comme premier paramètre. Vous devez donc passer le premier argument comme identifiant du conteneur auquel vous avez ajouté le premier fragment.

Vous pouvez vous référer à ce lien pour plus de détails.

J’ai eu 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 le SupportFragmentManager et que je tentais de remplacer le fragment par le FragmentManager, le fragment serait simplement ajouté au sumt. Je devais changer le code pour que le même FragmentManager soit utilisé et que cela prenne en charge le problème.

Le site de développement Android suggère l’utilisation d’un FrameLayout pour charger des fragments dynamicment au moment de l’exécution. Vous avez codé en dur le fragment dans votre fichier XML. Ainsi, il ne peut pas être supprimé lors de l’exécution, comme mentionné dans ce lien:

http://developer.android.com/training/basics/fragments/creating.html

Ce lien montre comment append des fragments dans votre programme:

http://developer.android.com/training/basics/fragments/fragment-ui.html

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 

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 fichier XML de l’activité du conteneur comme suit:

    

après cela, bien que je passais le FrameLayout à fragmentTransaction.replace() mais j’avais le problème exact. il montrait le deuxième fragment par-dessus le précédent.

Le problème a été résolu en supprimant le fragment du onCreate() XML et en l’affichant par programmation dans la méthode onCreate() de l’activité conteneur pour l’aperçu par défaut au début du programme, comme ceci:

  fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_frame_layout,new ShopFragment()); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); 

et l’activité du conteneur xml:

  

Je suis d’accord avec la réponse de Sapan Diwakar. Mais j’ai trouvé une solution pour y parvenir.

Tout d’abord, dans votre activité (par exemple, activity_main ), où vous avez toutes les dispositions, ajoutez un FrameLayout . Sa hauteur et sa largeur doivent match parent . Aussi, donnez-lui un id .

Maintenant, dans votre fragment qui va remplacer la disposition actuelle, appelez onPause() et onResume() . Initialise tous les conteneurs internes dans View . Et définissez leur visibility sur GONE dans onResume() et VISIBLE dans onPause() .

Remarque : pas le FrameLayout que vous remplacez par ce fragment.

Supposons que vous ayez ViewPager , ViewPager , TabLayout et un dans activity_main.xml . Ajouter, un FrameLayout comme mentionné ci-dessus.

Dans abcFragment.java , dans la fonction onClick() , ajoutez addToBackstack(null) dans la transaction .

Exemple de code:

dans xyzFragment, qui va remplacer abcFragment (et tout ce qui est affiché 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); } 

Heureux codage!

Merci à Sapan Diwakar et aux autres. Cette réponse m’a aidé. J’ai simplement créé un RelativeLayout sans fragment à l’intérieur, j’ai utilisé le RelativeLayout en tant que vue parent ou en groupe, j’ai spécifié cette vue de groupe dans la transaction à remplacer et cela a fonctionné.

Code: getSupportFragmentManager (). BeginTransaction () .replace (R.id.content_group_view, itemDetailFragment) .commit ();

Disposition: