【发布时间】:2019-08-03 08:34:53
【问题描述】:
我正在使用ViewPager2 构建一个应用程序,该应用程序在滑动时会显示不同的片段。我的适配器扩展了FragmentStateAdapter,如here 所述。
当我将我的应用程序置于后台然后再次恢复时,当前片段消失了。我需要做些什么来确保当前片段被正确恢复?
(注意:我问的是FragmentStateAdapter,而不是FragmentPagerAdapter 或FragmentStatePagerAdapter。)
更新 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