後者は前者のすべての問題を解決することになっているので、ViewPager
を_ViewPager2
_に移行しています。残念ながら、FragmentStateAdapter
で使用すると、現在表示されているフラグメントを取得する方法が見つかりません。
viewPager.getCurrentItem()
は現在表示されているインデックスを提供し、adapter.getItem(index)
は通常、現在のインデックスに対して新しいFragment
を作成します。 getItem()
で作成されたすべてのフラグメントへの参照を保持しない限り、現在表示されているフラグメントにアクセスする方法はわかりません。
古いViewPager
では、1つの解決策は、目的のインデックスでフラグメントを返すadapter.instantiateItem(index)
を呼び出すことでした。
_ViewPager2
_で何か不足していますか?
私もあなたの問題を抱えていて、このトリックを使いました
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);
同じ問題に直面していましたが、アダプターにオブジェクトを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つのフラグメントでのみテストしました
みんな応援しています、これがあなたに役立つことを願っています!