1.fragment 作为碎片加入FragmentActivity中,却可以在单独的自己的Fragment中处理自己的数据及其页面显示
2.无论是FragmentActivity通过add方法,还是通过Viewpager的形式来引入fragment,都会涉及到多个fragment和不同fragment页面的数据加载
同时,显示的fragment的加入activity和显示的ui上顺序是不同的。
1.add方法,是要先实例化你要添加的Fragment 例如。MyFragment mfgt = new MyFragment(); 然后add到界面中,如果你这个Activity中要放入多个fragment,
那么就要new 出多个对象,然后放入到activity中,从中可以看到mfgt 是最先放到界面上的,那么就会最先显示这个界面,那么这个fragment的数据也就会随着加载。
虽然其他的fragment 被hide(),等你show()的时候才能看得到,但是他的数据已经请求过了,并不是你看的时候才会去请求显示的。也就是说,一下子有好多的数据
请求,即使没显示,可能用户根本故关心的界面数据都进行了请求,浪费流量、增加服务器压力、客户端做了不必要的操作,降低体验的速度
2.第二种是通过viewpager的方式,返回一个个fragment实例。显示在界面上,vp的默认缓存是3个页面,也就是说,你在第2个页面,其实,第1.3这两个界面已经去自动
去获取数据,这样就发生了和add一样的尴尬。
3.那么有没有一种方法能够做到我显示那个fragment,我就只做这一个fragment的页面数据请求的呢?答案是肯定的,可以!
那就是fragment的懒加载:
//用于延迟切换,可用于界面出现之后的刷新显示
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
// TODO Auto-generated method stub
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Log.e("fragment切换", folderName);
}
}
google,已经为我们提供了这个方法,来判断是哪个fragment显示在当前界面,我们只需要在boolean 返回值是true的时候,进行数据请求和页面刷新就可以了。
4.真的如上所述万事无忧了,NONONNO,如果你都把数据请求都放在这里,那么在FragmentActivity就会显示空指针了,这时候的空指针是没有找到相应的第一放入
fragmentActivity中的fragment 的view里面的控件,为什么呢?因为setUserVisibleHint()这个方法的调用是在OnCreateView()之前的,而fragment显示的VIew是在onCreateVIew()这个方法里返回的,那么该怎么办呢?可以在Fragment中,设置一个boolean isCanLoading = false;值,如下
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.e("测试生命周期", "运行Main"); mMainfgt = inflater.inflate(R.layout.main_fgt, container, false); dealLogicAfterOnCreate(); initView(); initListener(); initData(); isCanLoading = true; onLoadingForData(); return mMainfgt; }
然后,系统方法中,我们定义的判断条件在加上一个
//用于延迟切换,可用于界面出现之后的刷新显示 @Override public void setUserVisibleHint(boolean isVisibleToUser) { // TODO Auto-generated method stub super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isCanLoading) { // Log.e("fragment切换", folderName); } }
这样就可以,做到不会出现空指针异常了。
5.那么我们再考虑考虑还会出现什么问题呢?其实还有一个问题,就是,在用setUserVisbleHint方法来判断当前fragment是不是显示,有一个重要的前提,就是,你必须用这个fragment.setUserVisbleHint(true)之后才能得到数值,在fragment中重写了这个方法才会生效,要不然是不会运行到这里面的。那么有人会说了,我的就不用,都可以用,那么你用的一定是viewpager+fragment ,因为viewpager为fragment准备的适配器源码中,自动为你自定调用了这个方法了,也就是说,你滑到了那个fragment,这个fragment就自动加载了这个方法了,所以是没问题的。以上问题会出现,就是出现在用add()方法中,因为这个没有自动帮你调用这个方法,所以用add方法来加入fragment的,在切换fragment的时候要自己调用fragment.setUserVisbleHint(true)哦。
6,ok,以上之后就没出现什么bug了。