1

J'ai trouvé tellement de questions similaires et tellement de réponses différentes, mais aucun d'entre eux m'a aidé. Je vais essayer de poser une question claire pour obtenir une réponse claire si c'est possible.Comment remplacer fragment de ViewPager avec un nouveau

J'ai donc une activité qui a un ViewPager avec FragmentStatePagerAdapter contenant (pour l'instant) un seul fragment (HomeScreenFragment).

Inside HomeScreenFragment J'ai un RecyclerView avec une liste de plusieurs types d'icônes différentes qui devraient ouvrir un fragment différent pour chaque clic d'élément.

HomeScreenFragment a un FrameLayout en tant que mise en page racine avec le nom d'identifiant "conteneur". Ceci est la méthode que je vous appelle pour remplacer HomeScreenFragment avec MainTypesFragment dans ce cas:

private void openAllTypesFragment() { 
    MainTypesFragment fragment = new MainTypesFragment(); 
    FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.container, fragment); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    transaction.addToBackStack(HomeScreenFragment.class.getName()); 
    transaction.commit(); 
    eventBus.post(new Event(null, Event.EVENT_FRAGMENT)); 
} 

Depuis FragmentStatePagerAdapter est initialisé dans MainActivity, je vous envoie un événement qui va attraper MainActivity et appeler adapter.notifyDataSetChanged();

En procédant ainsi, rien ne se passe .. J'ai essayé avec getChildFragmentManager() au lieu de getActivity(). GetSupportFragmentManager() et dans ce cas, fragment précédent (HomeScreenFragment) est visible sous un nouveau (MainTypesFragment) ..

Toutes les idées que je fais mal ici?

+0

vous voulez remplacer le fragment précédent ou vous voulez juste ouvrir un nouveau fragment au-dessus de l'ancien? –

+0

Je veux avoir 2 fragments à l'intérieur viewpager (HomeScreenFragment) qui peut être remplacé par plusieurs fragments possibles, selon le type de clic RecyclerView élément et un fragment qui est toujours là comme un second fragment dans viewpager – user8789149

+0

Si je comprends bien, vous avez besoin séparé piles de fragments pour chaque page? Comme vous cliquez sur la page 1 liste élément 1 et apparaîtra nouveau fragment au-dessus de la liste sur la page1? –

Répondre

0

Le conteneur que vous utilisez est incorrect.Gardez un conteneur dans le fichier xml d'activité et utilisez ce conteneur pour charger tous les fragments.

transaction.replace(R.id.container, fragment); 

Le conteneur doit ici être le conteneur d'activité dans lequel viewpager et autres vues doivent être présentes.

+0

cas je remplacerais viewpager entier avec un nouveau fragment, non? Je veux avoir 2 fragments dans viewpager et seulement le premier peut être remplacé en fonction du type d'élément cliqué à l'intérieur de celui-ci ... Par exemple, j'ai un HomeScreenFragment et SecondFragment dans viewpager lorsque l'application est en cours d'exécution. Après avoir cliqué sur l'un des éléments à l'intérieur de HomeScreenFragment, il devrait être remplacé par MainTypesFragment, mais SecondFragment ne devrait pas être touché. Est-ce possible? – user8789149

+0

alors vous devez garder un frameLayout pour cet espace à l'intérieur de xml qui correspond à la vue HomeScreenFragment et puis vous avez remplacer .. Si vous ajoutez des codes, je peux dire clairement. – Anonymous

+0

En fait, la meilleure solution sera de savoir comment vous avez suggéré. J'ai donc un ViewPager dans FrameLayout avec l'ID fragment_container. Quand j'appelle la méthode de remplacement, je mets cet id comme premier paramètre mais il ne le remplace pas bien .. Je peux voir le nouveau fragment, mais le précédent, le principal est toujours visible sous un nouveau (celui de ViewPager). .. – user8789149

0

Vous pouvez essayer mon code:

private void addFilmDetailFragment(Movie movie){ 
     android.support.v4.app.FragmentManager fragmentManager = getFragmentManager(); 
     android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     FilmDetailFragment fragment = new FilmDetailFragment(); 

     Bundle bundle = new Bundle(); 
     bundle.putParcelable("movie", movie); // Key, value 
     fragment.setArguments(bundle); 

     fragmentTransaction.replace(R.id.mainContentStore, fragment); 
//  fragmentTransaction.replace(R.id.mainContent, fragment, Config.TAG_FILM_DETAIL); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 

Dans un fragment de viewpager:

<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mainContentStore" 
    android:layout_width="match_parent" 
    android:layout_gravity="center" 

    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerFilm" 
     android:layout_gravity="center" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 


</FrameLayout> 

Il a travaillé pour moi, je l'espère, il aidera votre problème!

+0

Pouvez-vous s'il vous plaît fournir quelques informations sur la structure et les identifiants que vous utilisez? L'identifiant "mainContentStore" de votre mise en page racine actuelle ou le viewpager de la mise en page d'image est-il à l'intérieur? – user8789149

+0

Mais le fragment que vous remplacez n'est pas dans ViewPager, n'est-ce pas? Vous venez de remplacer un fragment régulier par un nouveau? – user8789149

0

Vous avez besoin d'un conteneur à l'intérieur de l'activité pour ViewPager et à l'intérieur de fragments (pages), conteneurs pour l'ouverture de nouveaux fragments à l'intérieur des pages.

Et si vous voulez ouvrir nouveau fragment, vous devriez utilisateur quelque chose comme ceci dans le fragment page

getChildFragmentManager().beginTransaction() 
     .replace(R.id.page_fragment_container, fragment) 
     .addToBackStack(name) 
     .commit() 

où conteneur intérieur R.id.page_fragment_container fragment de page.

+0

Cela fonctionne, mais le HomeScreenFragment (celui de ViewPager) reste visible sous un nouveau ... – user8789149

+0

ajouter un arrière-plan pour le nouveau fragment et dans 'android: clickable =" true "' pour la mise en page racine. Si vous avez besoin de l'opportunité de revenir au fragment précédent. –