【问题标题】:how to prevent viewpager to initialize next view by default in android?如何防止viewpager在android中默认初始化下一个视图?
【发布时间】:2014-12-18 13:37:49
【问题描述】:

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

【问题讨论】:

    标签: android android-viewpager fragment


    【解决方案1】:

    您可以将 ViewPAger 页面内存限制更改为

    viewPager.setOffscreenPageLimit(0);
    

    deafult 为 1,因此左侧和右侧的一个 Fragment/View 将保留在内存中。

    但是这是不好的做法,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_PAGESmOffscreenPageLimit 并触发populate(); 方法,所有这些都使用反射,就像这样

    Field f = ViewPager.class.getDeclaredField("DEFAULT_OFFSCREEN_PAGES");
    f.setAccessible(true);
    f.setInt(viewPager, 0);
    

    那么setOffscreenPageLimit(0); 应该可以工作

    【讨论】:

    • 我试过这个。它不工作的适配器 = new ViewPagerAdapter(_activityWalkThrough, imageArra); view_pager_walk_through.setAdapter(适配器); view_pager_walk_through.setOffscreenPageLimit(o);
    • 正确,设置 0 已“弃用”(可以这么说)。见我上面的编辑。您可能总是创建自己的 ViewPager 来扩展原来的 ViewPager,但 Google 并没有无缘无故阻止这个 0 限制选项,这是一种不好的做法
    • 好的,让我试试你上面给出的建议。我会让你知道状态,谢谢
    【解决方案2】:

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

    【讨论】:

    • 不,onResume 也被称为屏幕外片段,这些片段处于屏幕外限制(不少于 1 将有至少 3 个onResumes 在活动开始或创建/膨胀@987654325 @,如果您的起始位置为 0,则为两个)
    • 然后使用:OnPageChangeListner 链接:developer.android.com/reference/android/support/v4/view/…
    • 我在我的 ans 中建议的这个解决方案。 @rahul 也可能使用反射,但不推荐也不是解决问题的正确方法
    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多