防止ViewPager破坏屏幕外视图

che*_*gon 129 android android-fragments android-viewpager

我有一个ViewPager连接到一个显示三个片段的FragmentPagerAdapter.当ViewPager从当前位置多次滑动时,它似乎会破坏托管片段的视图.

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

它也不会加载第三个片段,直到第一次滑动发生,这是有问题的,因为每个片段处理自己的服务调用,我宁愿在活动加载时同时关闭所有三个片段.延迟第三次服务呼叫不太理想.

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

Dav*_*unt 325

在支持包的修订版4中,ViewPager中添加了一个方法,允许您指定要使用的屏幕外页面数,而不是默认值1.

在您的情况下,您希望指定2,因此当您在第三页时,第一页不会被销毁,反之亦然.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
Run Code Online (Sandbox Code Playgroud)

  • 你好.在我正在进行的工作中,片段/页面是动态创建的,因此存在无限数量的可能片段.这种情况下,通常会达到10或更少.在这么多页面上使用这个解决方案不是很难使用内存吗?顺便说一句,片段只会保留视图.谢谢! (4认同)

Pan*_*iya 7

默认情况下,当您滑动页面时,ViewPager会重新创建片段。为防止这种情况,您可以尝试以下两种方法之一:

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

2.如果片段数量固定且相对较小,则在您的onCreate()中添加以下代码:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,第二种选择更有希望。但我敦促您同时尝试两者,看看其中哪一个有效。