Je migre mon ViewPager
vers ViewPager2
Car ce dernier est censé résoudre tous les problèmes du premier. Malheureusement, lorsque je l'utilise avec un FragmentStateAdapter
, je ne trouve aucun moyen d'obtenir le fragment actuellement affiché.
viewPager.getCurrentItem()
donne l'index affiché actuel et adapter.getItem(index)
crée généralement un nouveau Fragment
pour l'index actuel. À moins de garder une référence à tous les fragments créés dans getItem()
, je ne sais pas comment accéder au fragment actuellement affiché.
Avec l'ancien ViewPager
, une solution était d'appeler adapter.instantiateItem(index)
qui retournerait le fragment à l'index désiré.
Suis-je en train de manquer quelque chose avec ViewPager2
?
J'ai aussi eu ton problème et j'ai utilisé cette astuce
Map<Integer, Fragment> map = new HashMap<>();
@Override
public Fragment createFragment(int position) {
Fragment fragment;
switch (position) {
case 0:
fragment = new CircularFragment();
map.put(0, fragment);
return fragment;
case 1:
fragment = new LocalFragment();
map.put(1, fragment);
return fragment;
case 2:
fragment = new SettingsFragment();
map.put(2, fragment);
return fragment;
}
fragment = new CircularFragment();
map.put(0, fragment);
return fragment;
}
et vous pouvez obtenir un fragment comme celui-ci
LocalFragment f = (LocalFragment) map.get(1);
était confronté au même problème maintenant résolu en ajoutant un objet dans l'adaptateur
class MyViewPager2Adapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
private val FRAGMENTS_SIZE = 2
var currentFragmentWeakReference: WeakReference<Fragment>? = null
override fun getItemCount(): Int {
return this.FRAGMENTS_SIZE
}
override fun createFragment(position: Int): Fragment {
when (position) {
0 -> {
currentFragmentWeakReference= MyFirstFragment()
return MyFirstFragment()
}
1 -> {
currentFragmentWeakReference= MySecondFragment()
return MySecondFragment()
}
}
return MyFirstFragment() /for default view
}
}
après avoir créé l'adaptateur, j'ai enregistré mon Viewpager 2 avec ViewPager2.OnPageChangeCallback()
et remplacé sa méthode onPageSelected
maintenant simple a fait cette astuce pour obtenir le fragment actuel
private fun getCurrentFragment() :Fragment?{
val fragment = (binding!!.pager.adapter as MyViewPager2Adapter).currentFragmentWeakReference?.get()
retrun fragment
}
Je n'ai testé cela qu'avec 2 fragments dans ViewPager2
cheers guys, j'espère que cela peut vous aider.!