web-dev-qa-db-ja.com

ViewPager2で現在のフラグメントを取得する

後者は前者のすべての問題を解決することになっているので、ViewPagerを_ViewPager2_に移行しています。残念ながら、FragmentStateAdapterで使用すると、現在表示されているフラグメントを取得する方法が見つかりません。

viewPager.getCurrentItem()は現在表示されているインデックスを提供し、adapter.getItem(index)は通常、現在のインデックスに対して新しいFragmentを作成します。 getItem()で作成されたすべてのフラグメントへの参照を保持しない限り、現在表示されているフラグメントにアクセスする方法はわかりません。

古いViewPagerでは、1つの解決策は、目的のインデックスでフラグメントを返すadapter.instantiateItem(index)を呼び出すことでした。

_ViewPager2_で何か不足していますか?

19
guillaume-tgl

私もあなたの問題を抱えていて、このトリックを使いました

    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;
        }

そして、あなたはこのような断片を得ることができます

 LocalFragment f = (LocalFragment) map.get(1);
0
Mahdi

同じ問題に直面していましたが、アダプターにオブジェクトを1つ追加することで解決しました

_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

    }

}
_

アダプターを作成した後、Viewpager 2をViewPager2.OnPageChangeCallback()に登録し、そのメソッドonPageSelectedをオーバーライドしました

今簡単に現在のフラグメントを取得するためにこのトリックをしました

_ private fun getCurrentFragment() :Fragment?{

        val fragment = (binding!!.pager.adapter as MyViewPager2Adapter).currentFragmentWeakReference?.get()

        retrun fragment
    }
_

私はこれをViewPager2の2つのフラグメントでのみテストしました

みんな応援しています、これがあなたに役立つことを願っています!

0
Atif AbbAsi