web-dev-qa-db-fra.com

Obtenez le fragment actuel avec ViewPager2

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?

19
guillaume-tgl

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);
0
Mahdi

é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.!

0
Atif AbbAsi