9

我正在构建一个应用程序,使用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

调用我notifyDataSetChanged()onResume()主要活动暂时解决了这个问题,尽管它感觉就像一个比必要的更重的锤子。(原来的ViewPager+FragmentStatePagerAdapter在从后台引入应用程序后不需要这种类型的调用来正确地重新加载片段。)

更新 3

将我的依赖更新androidx.viewpager2:viewpager2:1.0.0-alpha01到最近发布androidx.viewpager2:viewpager2:1.0.0-alpha02的版本完全解决了这个问题:)。

4

1 回答 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
    }
}

官方文档:阅读这里

于 2020-10-11T16:54:17.217 回答