2011-12-01 103 views
101

我有一个ViewPager连接到显示三个片段的FragmentPagerAdapter。当ViewPager从当前位置滑动多次时,ViewPager似乎会销毁托管片段的视图。防止ViewPager破坏屏幕外视图

这些视图都是简单的列表,这种优化是完全不必要的,所以我想禁用它。它会导致一些视觉问题,因为这些列表已经应用了布局动画,并且这些动画在它们被销毁和重新创建后正在重播。它还会每次显示滚动条介绍动画(滚动条可以短暂显示以指示滚动是可能的),这可能会分散注意力,并且用户当前的滚动位置在此过程中丢失。

它也不加载第三个片段,直到第一次刷卡发生,这是有问题的,因为每个片段都处理自己的服务调用,并且我更愿意在活动加载时同时启动所有三个片段。延迟第三次服务呼叫并不理想。

有没有什么办法说服ViewPager停止这种行为,并只保留我的所有片段在内存中?

回答

277

在支持包,一个方法,将ViewPager它允许您指定要使用的屏幕外的页面的数量,而不是默认的是1

在你的情况的revision 4,要指定2,所以当你在第三页时,第一页不会被销毁,反之亦然。

mViewPager = (ViewPager)findViewById(R.id.pager); 
mViewPager.setOffscreenPageLimit(2); 
+0

任何想法如何在coverflow上做到这一点? – josephus

+4

你好。在我的工作中,片段/页面是动态创建的,因此存在无限数量的可能片段。这种情况下,通常会达到10或更少。使用这种解决方案到那​​么多页面会不会使用内存不足?顺便说一下,这些碎片只能保留视图。谢谢! – mahkie

+0

此方法会抛出:“java.lang.IllegalStateException:Fragment已添加:”错误,对于我的应用程序。 – alicanbatur

2

默认情况下,ViewPager当你刷卡的页面重新创建的片段。为了防止这种情况,您可以尝试以下两种情况之一:

1.在片段的onCreate()中,调用setRetainInstance(true)。

2.如果碎片的数量在你的onCreate固定&比较小,则()中添加如下代码:如果我没有记错

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); 
mViewPager.setOffscreenPageLimit(3); 

,第二个选项是更有前途。但我强烈建议您尝试两种方法,看看其中哪些方法有效。

+1

第二个为我工作。 –