2017-10-18 5 views
0

J'ai actuellement un FragmentPagerAdapter qui crée de nouvelles instances de chaque Fragment grâce à la méthode getItem (position int). Cependant, je ne sais pas trop comment accéder au fragment que j'ai créé à nouveau. Existe-t-il une méthode publique qu'une autre classe peut appeler à partir de FragmentPagerAdapter pour sélectionner le fragment spécifique créé, par exemple, à la position 12?Comment accéder à un fragment spécifique dans FragPagerAdapter?

public class ChannelFragmentAdapter extends FragmentPagerAdapter { 
    private int numChannels; 
    public ChannelFragmentAdapter(FragmentManager fm, Activity context, PatientSettings user) { 
     super(fm); 
     this.context = context; 
     numChannels = user.channelsLimit; 
     for(int i = 1; i <= numChannels; i++){ 
      channelTabs.add("" + i); 
     } 
    } 

    @Override 
    public int getCount() { 
     return channelTabs.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     //new instance is a static factory for creating Fragment objects 
     return ChannelFragment.newInstance(position + 1, this); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     //generate title based on item position 
     //return tabTitles[position]; 
     return channelTabs.get(position); 
    } 
} 
+0

pouvez-vous nous fournir votre code? – Jerrol

+0

Je vais mettre à jour ma question avec le code pertinent. –

Répondre

1

Je suppose que vous essayez de créer un viewpager qui prend en charge plus de 5 fragments, donc en utilisant FragmentStatePagerAdapter est mieux.

Retour à votre question, en utilisant le tag Fragment et entrez par findFragmentByTag(). Dans votre adaptateur, stockez-les dans une liste et récupérez-les quand vous en avez besoin.

public class ChannelFragmentAdapter extends FragmentPagerAdapter { 
    private int numChannels; 
    Map<Integer, String> tags; 

    public ChannelFragmentAdapter(FragmentManager fm, Activity context, PatientSettings user) { 
     super(fm); 
     this.context = context; 
     numChannels = user.channelsLimit; 
     tags = new HashMap<>(); 
     for (int i = 1; i <= numChannels; i++) { 
      channelTabs.add("" + i); 
     } 
    } 

    @Override 
    public int getCount() { 
     return channelTabs.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     //new instance is a static factory for creating Fragment objects 
     return ChannelFragment.newInstance(position + 1, this); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     //generate title based on item position 
     //return tabTitles[position]; 
     return channelTabs.get(position); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment createdFragment = (Fragment) super.instantiateItem(container, position); 
     tags.put(position, createdFragment.getTag()); 
     // ... save the tags somewhere so you can reference them later 
     return createdFragment; 
    } 
} 

Remarque: S'il vous plaît vérifier null lorsque vous utilisez findFragmentByTag(), votre fragment pourrait être détruit ou remplacé.

+0

Merci pour la réponse. Maintenant, je suis curieux en tant que ce qui est spécifiquement différent dans la façon dont FragmentStatePagerAdapter et FragmentPagerAdapter organisent/utilisent les fragments qu'ils contiennent. –

+0

Pensez de manière simple, si vous voulez créer beaucoup de fragments (comme l'application de lecture de livres), utilisez FragmentStatePagerAdapter –