如何告诉自定义的FragmentPagerAdapter停止销毁我的碎片?

23

我有一个带有FragmentPagerAdapter的ViewPager,之前我的应用程序只使用了两个不同类型的片段,没有问题。

我刚刚添加了第三个片段,现在我的适配器/ViewPager似乎会在我远离它们时销毁我的片段。例如,如果我在第1页,当我接近第3页时,第3页被销毁并重新创建。如果我在第3页,第1页也是同样的情况。

这在我的应用程序中引起了许多问题。这些片段并不占用很多RAM,那么我该如何阻止这种情况发生?


是销毁Fragment还是销毁View? - DeeV
我不确定。我该如何检查? - Steven Schoen
1
你刚才说“它引起了很多问题”。如果Fragment被销毁,那么它的状态将从内存中清除并在重新加载时重置为默认值。 - DeeV
如果您使用FragmentPagerAdapter,则在滑动时创建的Fragments将永远不会被销毁。只有onPauseonStop方法将被调用。可能您正在使用FragmentStatePagerAdapter - AppiDevo
当然,在 onStop 之后,onDestroyView 也会被调用。 - AppiDevo
2个回答

53

我相信你正在寻找 ViewPager.setOffscreenPageLimit()

根据你的情况,下面的代码应该可以将你的fragment保留在内存中而不被销毁。

ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setOffscreenPageLimit(2);

然而,我怀疑你在销毁视图状态时没有正确地进行存储。你的碎片应该能够正确处理被销毁/重新创建的情况。例如,如果发生方向更改,你的碎片也会被销毁和重新创建。如果用户离开你的应用程序并且系统稍后需要内存并且销毁了你的Activity,则也可能发生这种情况。它应该能够重新打开并处于之前的相同状态。如果这确实是你的问题,请考虑在 onSaveInstanceState()中保存状态。所保存的状态将在 onCreate 中呈现给您,在那里您可以初始化碎片状态以与销毁的状态相同。


太好了!这将是我的临时解决方案,直到我使我的片段更加独立于网络。 - Steven Schoen
1
大多数情况下不会调用onSaveInstanceState()。例如,您在第1页,移动到第5页:第一个片段会经历onDestroyView(),但不会经历onSaveInstanceState()。至少在我的情况下是这样。 - natario

5

只需在FragmentpagerAdapter中覆盖此方法即可。

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
       // TODO Auto-generated method stub
       super.destroyItem(ViewGroup container, int position, Object object);
}

从您的代码中删除 super.destroyItem(ViewGroup container, int position, Object object);


只要您_永远_不想销毁Fragment(即使FragmentPagerAdapter超出范围),这将起作用。 这可能会有问题,但在某些情况下非常完美。 对于那些问题情况,您始终可以自己调用destroyItem(..) - SMBiggs
非常感谢您提供的解决方案 :) - Anjali-Systematix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接