2

J'essaye d'obtenir la référence à un fragment spécifique appelé MyChatsFragment après l'instanciant avec un SectionPageAdapter fait sur commande.Comment obtenir la référence de fragment de ViewPager

D'abord, je suis d'ajouter les fragments

mSectionsPageAdapter.addFragment(new CatalogFragment()); 
    mSectionsPageAdapter.addFragment(new MyBooksfragment()); 
    mSectionsPageAdapter.addFragment(new MyChatsFragment()); 
    viewPager.setAdapter(mSectionsPageAdapter); 

Je suis en train de récupérer MyChatsFragment cette façon:

MyChatsFragment myChatsFragment = (MyChatsFragment) mSectionsPageAdapter 
                   .getRegisteredFragment(2); 

Pourtant, getRegisteredFragment(2) retours null et pendant le débogage, je l'ai remarqué ce qui suit:

Dans l'adaptateur, instantiateItem n'est appelé que deux fois, ce qui ajoute CatalogFragment d MyBooksFragment à registeredFragments SparseArray. Cela expliquerait pourquoi getRegisteredFragment(2) renvoie null. Mais pourquoi MyChatsFragment est réellement créé et l'application est parfaitement fonctionnelle si instantiateItem n'est même pas appelé pour cela?

Pourquoi MyChatsFragment n'est pas ajouté à registeredFragments SparseArray alors que d'autres fragments le sont?

Est-ce que getItem(position) est une solution viable?

Après avoir vérifié this answer, je l'ai adapté mon SectionsPageAdapter en remplaçant instantiateItem et destroyItem que vous serez en mesure de vérifier le code ci-dessous:

public class SectionsPageAdapter extends FragmentPagerAdapter{ 
private final List<Fragment> mFragmentList = new ArrayList<>(); 
private final SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 

public void addFragment(Fragment fragment) 
{ 
    mFragmentList.add(fragment); 
} 


public SectionsPageAdapter(FragmentManager FM) 
{ 
    super(FM); 
} 
@Override 
public Fragment getItem(int position) { 
    return mFragmentList.get(position); 
} 

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

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    Fragment fragment = (Fragment) super.instantiateItem(container, position); 
    registeredFragments.put(position, fragment); 
    return fragment; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    registeredFragments.remove(position); 
    super.destroyItem(container, position, object); 
} 

public Fragment getRegisteredFragment(int position) { 
    return registeredFragments.get(position); 
    } 
} 

Note: Si nécessaire, je peux partager le code MyChatsFragment.

Répondre

0

Utilisez viewPager.getAdapter.getItem(position); depuis votre Activity ou le parent Fragment.

Description (modifiée) - Comme vous l'avez écrit addFragment() ajoute un fragment à mFragmentList et vous ajoutez fragment par cette méthode trop en appelant mSectionsPageAdapter.addFragment(new MyChatsFragment()). et getItem() renvoie un fragment de mFragmentList où vous avez ajouté votre fragment. Donc, si vous voulez obtenir la référence MyChatsFragment, utilisez simplement MyChatsFragment myChatsFragment = (MyChatsFragment) mSectionsPageAdapter .getItem(position); ou MyChatsFragment myChatsFragment = (MyChatsFragment) viewPager.getAdapter.getItem(position);

+0

Comme je l'ai demandé dans mon article, veuillez fournir une brève explication concernant la méthode 'getItem'. –

+0

Comme vous avez écrit 'addFragment()' ajoute un fragment à 'mFragmentList' et vous ajoutez un fragment par cette méthode en appelant' mSectionsPageAdapter.addFragment (new MyChatsFragment()) '. et 'getItem()' retourne un fragment de 'mFragmentList' où vous avez ajouté votre fragment. Donc, si vous voulez obtenir la référence 'MyChatsFragment', utilisez simplement MyChatsFragment myChatsFragment = (MyChatsFragment) mSectionsPageAdapter .getItem (2);' ou 'MyChatsFragment myChatsFragment = (MyChatsFragment) viewPager.getAdapter.getItem (2);' –