ViewPager2多次切换Tab后首个Fragment布局消失问题求助
核心原因
你遇到的问题本质是FragmentStateAdapter绑定的生命周期对象不正确:当你用viewLifecycleOwner.lifecycle作为参数时,宿主Fragment的视图生命周期(ViewLifecycleOwner)会在Fragment被滑出offscreen范围、视图被销毁时走到DESTROYED状态。后续ViewPager2重建这个Fragment时,绑定的生命周期已经失效,导致Fragment无法正常初始化视图,出现白屏。
具体修复步骤
替换生命周期参数
把构造器里的viewLifecycleOwner.lifecycle换成宿主Fragment自身的lifecycle,因为宿主Fragment的生命周期比它的视图生命周期更长,即使视图被销毁,宿主的生命周期依然处于活跃状态,能保证重建的Fragment正常加载:pagerAdapter = MyCustomPagerAdapter(requireContext(), childFragmentManager, this.lifecycle)修正createFragment的实现
不要提前缓存Fragment实例列表,FragmentStateAdapter本身会负责Fragment的回收和重建,每次调用createFragment时都创建新的实例:
错误示例(缓存实例):private val fragments = listOf(FirstFragment(), SecondFragment(), ThirdFragment()) override fun createFragment(position: Int): Fragment { return fragments[position] }正确示例:
override fun createFragment(position: Int): Fragment { return when(position) { 0 -> FirstFragment() 1 -> SecondFragment() 2 -> ThirdFragment() else -> throw IllegalArgumentException("无效的页面位置") } }检查子Fragment的视图加载逻辑
确保子Fragment的onCreateView每次都正确加载布局,不要依赖可能被销毁的View引用:override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // 每次都重新inflate布局,避免复用失效的View对象 return inflater.inflate(R.layout.fragment_first, container, false) }可选:调整offscreenPageLimit(按需)
如果业务场景允许,可以适当调大offscreenPageLimit的值,减少Fragment被回收的次数,但这会增加内存占用,需要根据实际情况权衡。不过优先解决生命周期绑定的问题,这才是根本诱因。
内容的提问来源于stack exchange,提问作者Matija Sokol

