我已经实现了 viewpager 以在 android 应用程序中显示一些介绍屏幕。有 4 个不同的屏幕,上面有不同的动画。我的问题是,当用户在 viewpager 的 0 fragment 上时, fragment 1 默认初始化并且动画在后台结束,当用户转到 fragment 1 时没有动画(因为当 fragment 1 与 fragment 1 同时初始化时动画已经结束)。我想做的是,当用户在 fragment 0 上时,只有 fragment 0 应该初始化,而不是下一个 fragment ,即 fragment 1。当用户转到 fragment 1 时, fragment 0 应该销毁,以便在滑回 fragment 0 时它应该再次初始化以显示动画。我该怎么做。
最佳答案
您可以将 ViewPAger 页面内存限制更改为
viewPager.setOffscreenPageLimit(0);
默认为 1,因此左侧和右侧各一个 Fragment/View 将保留在内存中。
但这是一种糟糕的做法,viewPager 在每一侧都保留一个 fragment/ View ,以获得更好的性能以及平滑和立即滚动的可能性。我建议您为 ViewPager
创建监听器,它会在滚动到所需 fragment 时触发动画(而不是在 onCreateView
中启动动画)。检查ViewPager.OnPageChangeListener , 特别是 onPageSelected(int position)
方法
编辑: 谷歌承认将限制设置为 0 是很弱的,在最新版本的 logcat 中说:
Requested offscreen page limit 0 too small; defaulting to 1
所以你必须使用监听器来触发动画,它对性能也更好。就像您看到的那样,您想要使用的方法已被作者(Google 本身)弃用。 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);
应该可以工作
关于android - 如何防止 viewpager 在 android 中默认初始化下一个 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27547882/