如何在安卓中防止ViewPager默认初始化下一个视图?

6
我已经在Android应用中实现了viewpager,以展示一些介绍屏幕。有4个不同的屏幕,在每个屏幕上都有不同的动画效果。我的问题是,当用户在viewpager的0片段上时,片段1会默认初始化并在后台结束动画,当用户转到片段1时,就没有动画了(因为动画同时与片段1初始化结束)。我想要做的是,当用户处于片段0时,仅初始化片段0,而不是下一个片段,即片段1。当用户进入片段1时,片段0应该被销毁,以便在向后滑动到片段0时,可以重新初始化以显示动画。我该怎么做呢?
2个回答

4

你可以通过以下方式更改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

所以你必须使用监听器来触发动画,这对性能也更好。就像你看到的,你想使用的方法已被作者(即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_PAGESmOffscreenPageLimit并使用反射调用populate();方法,类似于这样。
Field f = ViewPager.class.getDeclaredField("DEFAULT_OFFSCREEN_PAGES");
f.setAccessible(true);
f.setInt(viewPager, 0);

然后 `setOffscreenPageLimit(0);` 应该可以工作。

我试过了,但它不起作用。 adapter = new ViewPagerAdapter(_activityWalkThrough, imageArra); view_pager_walk_through.setAdapter(adapter); view_pager_walk_through.setOffscreenPageLimit(o); - rahul
设置为0是“不推荐使用”的(假设)。请参见上面的编辑。您可以随时创建自己的ViewPager来扩展原始的ViewPager,但Google没有没有理由阻止这个0限制选项,这是一个不好的做法。 - snachmsm
好的,让我试一下你上面给的建议。我会告诉你进展情况的,谢谢。 - rahul

1

不对,onResume也会被调用到那些处于屏幕外但在屏幕外限制范围内的Fragment上(如果屏幕外限制不小于1,则在Activity启动或创建/填充ViewPager时将有最少3个onResume,如果您的起始位置为0,则为2个)。 - snachmsm
然后使用:OnPageChangeListener 链接:http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener) - Karioki
我在我的答案中提出了这个解决方案。@rahul 也许可以使用 Reflections,但这并不是推荐的、正确的解决问题的方式。 - snachmsm

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