我已经在Android应用中实现了viewpager,以展示一些介绍屏幕。有4个不同的屏幕,在每个屏幕上都有不同的动画效果。我的问题是,当用户在viewpager的0片段上时,片段1会默认初始化并在后台结束动画,当用户转到片段1时,就没有动画了(因为动画同时与片段1初始化结束)。我想要做的是,当用户处于片段0时,仅初始化片段0,而不是下一个片段,即片段1。当用户进入片段1时,片段0应该被销毁,以便在向后滑动到片段0时,可以重新初始化以显示动画。我该怎么做呢?
你可以通过以下方式更改ViewPAger页面的内存限制:
viewPager.setOffscreenPageLimit(0);
默认值为1,因此左右各保留一个片段/视图的内存。
但是这是一种不良实践,ViewPager在每侧保留一个片段/视图以获得更好的性能和平滑的即时滚动。我建议您为ViewPager创建监听器,在滚动到所需的片段时触发动画(不要在onCreateView中开始动画)。请查看ViewPager.OnPageChangeListener,特别是onPageSelected(int position)方法
编辑: 谷歌承认设置限制为0是弱点,在最新版本的logcat中显示:
Requested offscreen page limit 0 too small; defaulting to 1
ViewPager
类。public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}
ViewPager
,或者更改DEFAULT_OFFSCREEN_PAGES
或mOffscreenPageLimit
并使用反射调用populate();
方法,类似于这样。Field f = ViewPager.class.getDeclaredField("DEFAULT_OFFSCREEN_PAGES");
f.setAccessible(true);
f.setInt(viewPager, 0);
setOffscreenPageLimit(0);
` 应该可以工作。您可以像在活动中一样使用片段回调 onResume 来启动动画。 链接: http://developer.android.com/reference/android/app/Fragment.html#onResume%28%29
onResume
也会被调用到那些处于屏幕外但在屏幕外限制范围内的Fragment上(如果屏幕外限制不小于1,则在Activity启动或创建/填充ViewPager时将有最少3个onResume
,如果您的起始位置为0,则为2个)。 - snachmsm