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 ?

3voto

<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:windowBackground">
//Add fragment here
</FrameLayout>

Añadir android:background="?android:windowBackground"> au conteneur dans lequel votre fragment réside. Dans mon cas, j'ai ajouté un FrameLayout cela devrait aider.

1voto

TheOnlyAnil Points 305

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

Tout d'abord, dans votre activité (par ex. activity_main ), où vous avez toutes les mises en page, ajoutez une FrameLayout . Sa hauteur et sa largeur doivent être match parent . Aussi, donnez-lui un id .

Maintenant, dans votre fragment qui va remplacer la disposition actuelle, appelez onPause() y onResume() . Initialiser tous les conteneurs internes dans View . Et mettre leur visibility a GONE en onResume() y VISIBLE en onPause() .

NOTE : Pas le FrameLayout que vous remplacez par ce fragment.

Supposons que vous ayez ViewPager , TabLayout , ImageView et un <fragment> en activity_main.xml . Ajouter, un FrameLayout comme indiqué ci-dessus.

En abcFragment.java en onClick() ajouter la fonction addToBackstack(null) en transaction .

Exemple de code :

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

Bon codage !

1voto

Utiliser un conteneur au lieu d'utiliser un 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 fragment doit importer 'Android.app.Fragment'. Assurez-vous que vous utilisez l'implémentation "support.v4" ou l'implémentation "originale" et ne les mélangez pas. Je rencontrais ce problème parce que je les avais mélangées.

0voto

Craig D Points 41

Merci à Sapan Diwakar et aux autres. Cette réponse m'a aidé. J'ai simplement créé un RelativeLayout sans fragment à l'intérieur, utilisé le RelativeLayout comme parent ou vue de groupe, 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();

XML :

 <RelativeLayout
         android:id="@+id/content_group_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

 </RelativeLayout>

0voto

Lavkush2oct Points 79

Vous pouvez utiliser la méthode setTransition de FragmentTransaction pour résoudre le problème de chevauchement.

transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

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