【问题标题】:Fragment disappears with ViewPager2 and FragmentStateAdapter片段随着 ViewPager2 和 FragmentStateAdapter 消失
【发布时间】:2019-08-03 08:34:53
【问题描述】:

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

当我将我的应用程序置于后台然后再次恢复时,当前片段消失了。我需要做些什么来确保当前片段被正确恢复?

(注意:我问的是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)?
  • 查看更新的问题:)
  • 这里没有太多细节,但我能想到的一件事是,如果你正在处理嵌套片段,你必须通过 childFragmentManager() 而不是 supportFragmentManager()
  • 感谢您的评论@RodrigoQueiroz。我不是在处理嵌套片段,我的ViewPager2 是主活动布局的根视图。

标签: android androidx android-viewpager2


【解决方案1】:

您需要将 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
    }
}

官方文档:Read Here

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 2020-06-12
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多