Мне сказали использовать переопределение createFragment для FragmentStateAdapter, чтобы получить текущий фрагмент по индексу.
Так выглядит мой адаптер.
class AddRestaurantPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
FragmentStateAdapter(fragmentManager, lifecycle) {
private var fragments = listOf<Fragment>(
FragmentA.newInstance(),
FragmentB.newInstance(),
FragmentC.newInstance(),
FragmentD.newInstance()
)
override fun getItemCount() = 4
override fun createFragment(position: Int) =
fragments[position]
}
Это работает нормально, пока мы не принудительно активируем onSaveInstance / OnRestoreInstance для этого действия / фрагмента.
ViewPager2 перезагружает на нем уже существующие фрагменты, и нам нужен способ получить к нему доступ. Об этом свидетельствует следующий LOC в классе FragmentStateAdapter
private void ensureFragment(int position) {
long itemId = getItemId(position);
if (!mFragments.containsKey(itemId)) {
// TODO(133419201): check if a Fragment provided here is a new Fragment
Fragment newFragment = createFragment(position);
newFragment.setInitialSavedState(mSavedStates.get(itemId));
mFragments.put(itemId, newFragment);
}
}
После воссоздания активности / фрагмента вы обнаружите, что блок this If никогда не выполняется, потому что mFragments уже содержит фрагмент, добавленный до того, как действие было собрано.
Поэтому мне было интересно, как следует извлекать фрагменты уже в viewpager2