Фрагмент исчезает с ViewPager2 и FragmentStateAdapter
Я создаю приложение, используя ViewPager2
который отображает различные фрагменты при наведении. Мой адаптер расширяется FragmentStateAdapter
как описано здесь.
Когда я помещаю свое приложение в фоновый режим и затем возобновляю его снова, текущий фрагмент исчезает. Что мне нужно сделать, чтобы убедиться, что текущий фрагмент восстановлен правильно?
(Примечание: я спрашиваю о FragmentStateAdapter
не FragmentPagerAdapter
или же FragmentStatePagerAdapter
.)
Обновление 1:
Мой фрагмент класса выглядит следующим образом:
class PagerFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val layoutResId: Int = arguments!!.getInt(ARG_LAYOUT_RES_ID)
return inflater.inflate(layoutResId, container, false)
}
companion object {
private const val ARG_LAYOUT_RES_ID = "layoutResId"
fun newInstance(layoutResId: Int): PagerFragment {
val args = Bundle()
args.putInt(ARG_LAYOUT_RES_ID, layoutResId)
val fragment = PagerFragment()
fragment.arguments = args
return fragment
}
}
}
Я передаю нужный идентификатор ресурса макета для каждого фрагмента при его создании.
Мой вид адаптера пейджер класса выглядит следующим образом:
class ViewPagerAdapter(fm: FragmentManager) : FragmentStateAdapter(fm)
{
override fun getItem(position: Int): Fragment {
return PagerFragment.newInstance(Helper.getLayoutResId(position))
}
override fun getItemCount(): Int {
return Helper.getSize()
}
}
Добавление retainInstance = true
не решает проблему.
Обновление 2:
призвание notifyDataSetChanged()
в onResume()
в моей основной деятельности решает проблему на данный момент, хотя кажется, что молот тяжелее, чем нужно. (Оригинал ViewPager
+ FragmentStatePagerAdapter
не требует этого типа вызова для правильной перезагрузки фрагментов после загрузки приложения из фона.)
Обновление 3:
Обновление моей зависимости от androidx.viewpager2:viewpager2:1.0.0-alpha01
на недавно выпущенный androidx.viewpager2:viewpager2:1.0.0-alpha02
решает проблему полностью:).
0 ответов
Вместо FragmentManager вам необходимо передать свой экземпляр FragmentActivity или Fragment в качестве параметра конструктора FragmentStateAdapter.
private inner class ViewPagerAdapter(fragment: Fragment) :
FragmentStateAdapter(fragment) {
val fragments = arrayOf(
MyFragment1(),
MyFragment2()
)
override fun createFragment(position: Int): Fragment {
return fragments[position]
}
override fun getItemCount(): Int {
return fragments.size
}
}
Официальная документация: прочтите здесь