111 votes

Le fragment n'est pas remplacé mais posé sur le 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, c'est que le contenu n'est pas vraiment remplacé, il est placé au-dessus (de sorte qu'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 je rate ici ?

149voto

Sapan Diwakar Points 3184

Vous faites deux choses de travers ici :

  1. Vous ne pouvez pas remplacer un fragment qui est placé de manière statique dans une xml fichier de mise en page. Vous devez créer un conteneur (par exemple, un fichier FrameLayout ) dans la mise en page et ajoutez ensuite le fragment par programme en utilisant FragmentTransaction .

  2. 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 comme l'id du conteneur auquel vous avez ajouté le premier fragment.

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

33voto

swbandit Points 1264

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 autre de getFragmentManager() . Si j'ai ajouté un fragment avec le SupportFragmentManager puis j'ai essayé de remplacer le fragment par le FragmentManager le fragment serait simplement ajouté par-dessus. J'avais besoin de modifier le code de sorte que le même fragment soit ajouté à l'image. FragmentManager serait utilisé et cela a réglé le problème.

17voto

Poonam Anthony Points 581

Le site du développeur Android suggère l'utilisation d'un FrameLayout pour charger les fragments dynamiquement au moment de l'exécution. Vous avez codé en dur le fragment dans votre fichier xml. Il ne peut donc pas être supprimé à 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

7voto

Emad Points 145

J'ai eu le même problème et j'ai vu toutes les réponses, mais aucune ne contenait mon erreur ! Avant d'essayer de remplacer le fragment actuel, j'affichais le fragment par défaut dans le xml de l'activité conteneur comme ceci :

<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 le FrameLayout a la fragmentTransaction.replace() mais j'ai eu exactement le même problème. Il montrait le deuxième fragment par-dessus le précédent.

Le problème a été résolu en supprimant le fragment du xml et en l'affichant de manière programmatique dans le fichier onCreate() de l'activité conteneur pour l'aperçu par défaut au démarrage 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 :

<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

5voto

Michał Z. Points 3751

Vous pouvez effacer le backStack avant de remplacer les fragments :

    FragmentManager fm = getActivity().getSupportFragmentManager();

    for (int i = 0; i < fm.getBackStackEntryCount(); i++) {
        fm.popBackStack();
    }

    // replace your fragments

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X