Я использую ViewPager2
, FragmentStateAdapter
и TabLayout
для создания макета с вкладками. Мои TabLayout и ViewPager2 находятся во фрагменте, и у адаптера есть список еще двух фрагментов для вкладок. OnCreateView
для каждого из фрагментов никогда не вызывается, когда я использовал отладчик или в операторах журнала. createFragment
никогда не вызывается в адаптере вкладок
MainTabHolderFragment: фрагмент
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val tabAdapter = TabAdapter(childFragmentManager, lifecycle)
tabAdapter.addFragment(AddItemFragment(), "Add Item")
tabAdapter.addFragment(WishListFragment(), "Wish List")
binding.viewPager.adapter = tabAdapter
TabLayoutMediator(
binding.tabLayout, binding.viewPager,
TabLayoutMediator.TabConfigurationStrategy { tab, position ->
tab.text = tabAdapter.getPageTitle(position)
Timber.d("tab = ${tab.position}, pos = $position")
binding.viewPager.setCurrentItem(position, true)
}).attach()
}
TabAdapter
class TabAdapter(fm: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fm, lifecycle) {
private val fragmentList = mutableListOf<FragmentListItem>()
override fun createFragment(position: Int) = fragmentList[position].fragment
override fun getItemCount() = fragmentList.size
fun addFragment(fragment: Fragment, title: String) {
fragmentList.add(FragmentListItem(fragment, title))
}
fun getPageTitle(position: Int): CharSequence? = fragmentList[position].title
private data class FragmentListItem(val fragment: Fragment, val title: String)
}
Переменная tab.postion
в TabLayoutMediator всегда равна -1, и ViewPager никогда не раздувает фрагменты, в результате чего пустой экран под макетом вкладки. Нужно ли использовать что-то кроме TabLayoutMediator
или FragmentStateAdapter
?
РЕДАКТИРОВАТЬ: Добавлена информация о том, что createFragment
не называется