关于Android ViewPager 与 Fragment 一块儿使用碰到的问题

    这是我前段时间遇到的两个问题,状况是这样的:第一个问题:因为公司的 app 层级比较多,因此用了一个翻页的功能。在具体翻到某一页的时候,咱们须要更新当前页的完成时间,可是当我开发的时候发现翻到当前页的时候也会更新下一页的时间。经过调试,发现当我进入页面的时候 Fragment 会执行两次,至关于进入当前页面后会预加载下一页的内容。后来经过了解 Android 的 ViewPager 与 Fragment 发现系统会默认预加载功能,并且默认的数值是 2. 这让我好像找到了解决的办法,经过查找,我发现有一个方法 setOffscreenPageLimit(int limit) 能够设置预加载的数量,当我调用此方法,给 limit 赋值为 0 时发现不起做用,后来看了一下 ViewPager 的源码: private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES , 默认值是 1, 咱们来看看 setOffscreenPageLimit(int limit) 方法的源码:java

    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();
        }
    }

    在打印日志里面的语句就能够看到,若是 limit 小于默认值 1,limit 的值仍是被设置成了 1,因此至关于系统老是会默认预加载下一页的内容,这样要取消预加载这个方法怎么都无论用了。彷佛惟一的解决办法是修改源码的DEFAULT_OFFSCREEN_PAGES 值为 0,而后再从新打包放到本身的项目中。这样当然能够解决问题,但是是否还有其它的解决办法?我是这样的解决的:在 Fragment 里面实现一个接口,而后在 ViewPager 里面注册 setOnPageChangeListener 事件,在事件的 onPageSelected(int arg0) 方法里面添加更新时间的代码,这样当翻页时就会调用注册事件里面的 onPageSelected(int arg0) 方法,就能够只更新当前页的时间了。想法当然很好,可是新的问题又来了。app

    问题之二:当我运行时总会出现空指针异常,经过调试,我发现更新时间代码里面调用的 Fragment 成员变量值都为 null,难道翻页时都会首先销毁 Fragment,而后再从新 new 出一个对象?Android 彷佛就是这么作的,因此,在调用 Fragment 里面实现的那个接口方法时,不该该调用 Fragment 对象里面的成员变量,解决方法之一是把要使用到的成员变量保存在用到 ViewPager 的 Activity 里面。方法之二:Fragment虽然有onResume和onPause的,可是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效果,这里介绍一种方法:ide

    @Override  
    public void setUserVisibleHint(boolean isVisibleToUser) {  
        super.setUserVisibleHint(isVisibleToUser);  
        if (isVisibleToUser) {  
            //至关于Fragment的onResume  
        } else {  
            //至关于Fragment的onPause  
        }  
    }


当 isVisibleToUser 这个参数为true时,说明这个Fragment已经在你的眼前了,这时你再去加载你须要的数据或者更新数据就能够了。spa

相关文章
相关标签/搜索