ViewPager 中的片段被重新创建

Posted

技术标签:

【中文标题】ViewPager 中的片段被重新创建【英文标题】:Fragments in ViewPager get recreated 【发布时间】:2013-02-21 04:28:00 【问题描述】:

我有一个带有容器的FragmentActivity,我将FragmentViewPager 放在其中。在ViewPager 我有 3 个Fragments:

[MainActivity]
    [ViewPagerFragment]
        [Fragment1][Fragment2][Fragment3]

当用户单击Fragment1/Fragment2/Fragment3 上的按钮时,我将ViewPagerFragment 替换为OtherFragment,因此层次结构如下所示:

[MainActivity]
    [OtherFragment]

当我点击 Back 按钮时,ViewPagerFragment 以及其嵌套的 Fragments (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 中的片段被重新创建的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager 片段重新创建,已恢复但不可见

带有片段和 Jetpack 导航的 Viewpager2:恢复片段而不是重新创建它们

ViewPager2 中未显示图像(片段重新打开时)

在popBackStack之后,ViewPager中的碎片不是显示器

Realm和RecyclerView项目排序和自动ViewPager片段通信

使用 viewpager 创建多个片段