![](/img/trans.png)
[英]Fragment lifecylce behaviour using ViewPager2 and FragmentStateAdapter
[英]Fragment disappears with ViewPager2 and FragmentStateAdapter
我正在使用ViewPager2
构建一个应用程序,该应用程序在滑动时显示不同的片段。 我的适配器按照此处所述扩展FragmentStateAdapter
。
当我将我的应用程序置于后台然后再次恢复时,当前片段消失了。 我需要做什么来确保当前片段正确恢复?
(注意:我问的是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
完全解决了这个问题:)。
您需要将 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
}
}
官方文档: 阅读这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.