如何防止viewpager在android中默认初始化下一个视图?

时间:2014-12-18 13:37:49

标签: android android-viewpager fragment

我已经实现了viewpager来显示android App中的一些介绍屏幕。有4种不同的屏幕,上面有不同的动画。我的问题是,当用户在viewpager的0片段上时,片段1默认初始化,动画在后台结束,当用户转到片段1时,则没有动画(因为当片段1与片段1同时初始化时动画已经结束)。我想要做的是,当用户在片段0上时,只有片段0应该初始化不是片段1的下一个片段。当用户进入片段1时,片段0应该销毁,以便在滑回片段0时它应该再次初始化以显示动画。我怎么能这样做。

2 个答案:

答案 0 :(得分:0)

您可以通过

更改ViewPAger页面的内存限制
viewPager.setOffscreenPageLimit(0);

deafult是1,因此左侧和右侧的一个片段/视图将保留在内存中。

但这是不好的做法,viewPager在每一面都保留一个片段/视图以获得更好的性能,并且平滑并立即滚动可能性。我建议你为ViewPager创建一个监听器,它会在滚动到所需片段时触发动画(不会在onCreateView中启动动画)。检查ViewPager.OnPageChangeListener,尤其是onPageSelected(int position)方法

编辑: Google承认,设置0表示限制很弱,在最新版本中,logcat说:

Requested offscreen page limit 0 too small; defaulting to 1

因此您必须使用侦听器来触发动画,它的性能也会更好。就像你看到你想要使用的方法被作者(Google本身)弃用。来自ViewPager class

的方法
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);应该有效

答案 1 :(得分:0)

您可以在活动中使用片段回调onResume来启动动画。 链接:http://developer.android.com/reference/android/app/Fragment.html#onResume%28%29