Fragments affichés les uns sur les autres

J'ai une activité avec un DrawerLayout, en utilisant les directives de http://developer.android.com/training/implementing-navigation/nav-drawer.html .

Lorsque je clique sur un drawerItem, je remplace la vue actuelle par le nouveau fragment:

  • OnCreateOptionsMenu dans un cycle de vie Fragment
  • Comment puis-je passer à l'éditeur graphique dans Android Studio?
  • Désactivation du déplacement des utilisateurs sur BottomSheet
  • Décider qui est le joueur un et deux dans un jeu basé sur une ronde avec Google Play Game Services
  • Android: comment obtenir l'ID d'une vue parental?
  • Comment cacher le clavier après avoir tapé EditText dans Android?
  • Fragment fragment; Bundle args = new Bundle(); fragment = new NewsListFragment(); args.putInt("category", position); // Insert the fragment by replacing any existing fragment FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .commit(); mDrawerList.setItemChecked(position, true); 

    Maintenant, parfois, l'ancien fragment n'est pas remplacé mais le nouveau fragment est placé au dessus de l'ancien:

    Http://img15.imageshack.us/img15/3179/1kqj.png

    Pourquoi est-ce, et comment résoudre ce problème?

    XML pertinent:

     <!-- The main content view --> <LinearLayout android:id="@+id/rlMain" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent"> <FrameLayout android:id="@+id/content_frame" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> </FrameLayout> 

    Cela arrive parfois parfois, et je n'ai pas trouvé de flux pour reproduire cela encore. L'application ne supporte pas la rotation, donc ça n'arrivera pas là-bas.

  • Comment fonctionne Android les threads d'arrière-plan en quittant une activité?
  • Tuer un autre processus / application par programmation
  • NotificationListenerService: NullPointerException sur getActiveNotifications
  • Utilisation simultanée des caméras avant et arrière simultanément
  • Ajuster la disposition lorsque le clavier est allumé
  • Les boutons Make ont la même largeur dans la mise en page
  • 5 Solutions collect form web for “Fragments affichés les uns sur les autres”

    Nous sommes allés en live avec cette version et nous n'avons reçu aucune plainte à ce sujet, alors je suppose que c'est la bonne réponse:

    Dans votre méthode onCreateView , ajouter:

     if (container != null) { container.removeAllViews(); } 

    Assurez-vous de vérifier si le conteneur n'est pas nulle!

    Merci https://stackoverflow.com/users/2677588/lia-pronina !

    Après environ 1 semaine, j'ai trouvé la solution sans ajouter de couleur d'arrière-plan ou autre chose. Ajoutez simplement ce code et corrigez cette connerie. J'espère que cela vous aidera.

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment container.clearDisappearingChildren(); return inflater.inflate(R.layout.fragment, container, false); } 

    Essayons avec

     fragmentManager.beginTransaction().executePendingTransactions(); 

    Après que vous appelez la méthode commit ()

    Ajouter dans toutes les mises en page

     android:background="#FFFFFF" 

    L'arrière-plan des mises en page par défaut est transparent, alors mettez simplement une couleur d'arrière-plan et le fragment des nouveaux éléments, pas affiché sur un ancien fragment

    Je cours dans ce même problème et je vois qu'il y a déjà une réponse acceptée, mais cette réponse n'est pas 100% correcte et n'a pas corrigé mon problème. La réponse proposée par @Niels supprime les vues, mais le (s) fragment (s) est (sont) encore ajouté (s). C'est ce que j'utilise:

     /** * Call this to remove all the other added fragments and keep only the current one. * * @param activity the activity to which the fragment has been attached. * @param fragment the fragment we want to keep. */ public static void removeOtherAddedFragments(@NonNull AppCompatActivity activity, @NonNull Fragment fragment) { FragmentManager fragmentManager = activity.getSupportFragmentManager(); for (Fragment frag : fragmentManager.getFragments()) { if (frag != null && !frag.equals(fragment) && frag.isAdded()) { fragmentManager.beginTransaction().remove(frag).commit(); } } } 

    J'appelle cela dans mon OnResume pour être sûr que cela s'appellera aussi lorsque je reviendrai vers le fragment.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.