ViewPager 中的片段被重新创建
Posted
技术标签:
【中文标题】ViewPager 中的片段被重新创建【英文标题】:Fragments in ViewPager get recreated 【发布时间】:2013-02-21 04:28:00 【问题描述】:我有一个带有容器的FragmentActivity
,我将Fragment
和ViewPager
放在其中。在ViewPager
我有 3 个Fragment
s:
[MainActivity]
[ViewPagerFragment]
[Fragment1][Fragment2][Fragment3]
当用户单击Fragment1
/Fragment2
/Fragment3
上的按钮时,我将ViewPagerFragment
替换为OtherFragment
,因此层次结构如下所示:
[MainActivity]
[OtherFragment]
当我点击 Back 按钮时,ViewPagerFragment
以及其嵌套的 Fragment
s (Fragment1
/Fragment2
/Fragment3
) 被重新创建。
有没有办法保存ViewPagerFragment
及其嵌套片段的状态?这样片段将保持其状态而不被重新创建?
我已经为ViewPagerFragment
设置了setRetainInstance(true)
,但是好像没有生效。
【问题讨论】:
【参考方案1】:只需设置:- 其中参数是 ViewPager 中的片段数
mViewPager.setOffscreenPageLimit(3);
ViewPager 非常热衷于关闭它当前不使用的东西,而这正是这里发生的事情。 ViewPager 的默认行为是“保留”正在查看的页面两侧的一个页面,并销毁其余页面。因此在您的3页视图中,在选择第1页时会被销毁,然后重新选择Page 2时,重新选择Page 2。如您所见,第 2 页只调用了一次 onCreate(..),因为它始终与当前选定的页面相邻,或者是当前选定的页面。
要解决这个问题,只需设置 ViewPager.setOffscreenPageLimit(2)。然后 ViewPager 将保留您的所有片段。显然这对于大量 Fragment 来说不是一个好主意,但对于您的情况应该没问题。
【讨论】:
当系统资源不足时,您可能会遇到问题。片段中的某些视图或片段本身将被拆除,以便将这些资源用于其他地方。以上是关于ViewPager 中的片段被重新创建的主要内容,如果未能解决你的问题,请参考以下文章
带有片段和 Jetpack 导航的 Viewpager2:恢复片段而不是重新创建它们
在popBackStack之后,ViewPager中的碎片不是显示器