ViewPager2和FragmentStateAdapter一起使用时,片段会消失

10

我正在使用ViewPager2构建一个应用程序,通过滑动显示不同的片段。我的适配器扩展了FragmentStateAdapter,如此处所述。

当我将应用程序放入后台然后再次恢复时,当前片段会消失。我需要做什么来确保当前片段能够正确地恢复?

(注:我是在询问FragmentStateAdapter,而不是FragmentPagerAdapterFragmentStatePagerAdapter。)

更新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
    }
}

在创建每个片段时,我会传递所需的布局资源ID。

我的视图页适配器类如下:

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:

在我的主要活动中的onResume()中调用notifyDataSetChanged()暂时解决了问题,尽管感觉比必要的要重。 (原始的ViewPager+FragmentStatePagerAdapter不需要这种调用来从后台正确重新加载片段。)

更新3:

将我的依赖项从androidx.viewpager2:viewpager2:1.0.0-alpha01更新到最近发布的androidx.viewpager2:viewpager2:1.0.0-alpha02完全解决了该问题 :)


如果您分享您的代码,它会更加清晰明了。我认为它涉及到片段的生命周期,您是否尝试使用setRetainInstance(true)? - Beyazid
请提供更新后的问题。 - rstockbridge
3
这里的细节不多,但我能想到一件事情,那就是如果你正在处理嵌套的Fragment,你需要传递childFragmentManager()而不是supportFragmentManager() - Rodrigo Queiroz
感谢您的评论@RodrigoQueiroz。我没有处理嵌套片段,我的ViewPager2是主活动布局的根视图。 - rstockbridge
你找到解决办法了吗?我有相反的问题。嵌套的(子)片段第一次不显示,但在从后台切换应用后就显示了。 - undefined
更新到一个(现在已过时的)版本的ViewPager解决了我的问题。请参阅我的帖子上的更新3。 - undefined
1个回答

0

你需要将你的FragmentActivity或Fragment实例作为FragmentStateAdapter构造函数的参数,而不是FragmentManager。

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
    }
}

官方文档:在此阅读


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接