zoukankan      html  css  js  c++  java
  • Android

    我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。这样的结果,我们当然不会满意。那么,能不能做到当切换到这个fragment的时候,它才去初始化呢?

    答案就在Fragment里的setUserVisibleHint这个方法里。

    import android.support.v4.app.Fragment;
    
    /**
     * @Title: BaseFragment.java 
     * @Package com.ibanglife.fragment 
     * @Description: TODO 博客:http://www.cnblogs.com/brantliu/
     * @author Brant Liu  lbf1988@qq.com
     * @date 2015-11-2 下午2:56:22 
     * @version V1.0 
     */
    public abstract class BaseFragment extends Fragment{
    	protected boolean isVisible;
    	/**
         * 在这里实现Fragment数据的缓加载.
         * @param isVisibleToUser
         */
    	@Override
    	public void setUserVisibleHint(boolean isVisibleToUser) {
    		super.setUserVisibleHint(isVisibleToUser);
            if(getUserVisibleHint()) {
                isVisible = true;
                onVisible();
            } else {
                isVisible = false;
                onInvisible();
            }
    	}
    	protected void onVisible(){
            lazyLoad();
        }
        protected abstract void lazyLoad();
        protected void onInvisible(){}
    }
    

      在BaseFragment,我增加了三个方法,一个是onVisiable,即fragment被设置为可见时调用,一个是onInvisible,即fragment被设置为不可见时调用。另外再写了一个lazyLoad的抽象方法,该方法在onVisible里面调用。你可能会想,为什么不在getUserVisibleHint里面就直接调用呢?

      这么写是为了代码的复用。因为在fragment中,我们还需要创建视图(onCreateView()方法),可能还需要在它不可见时就进行其他小量的初始化操作(比如初始化需要通过AIDL调用的远程服务)等。而setUserVisibleHint是在onCreateView之前调用的,那么在视图未初始化的时候,在lazyLoad当中就使用的话,就会有空指针的异常。而把lazyLoad抽离成一个方法,那么它的子类就可以这样做:

    public class ContentFragment extends BaseFragment{
        // 标志位,标志已经初始化完成。
        private boolean isPrepared;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_open_result, container, false);
        //XXX初始化view的各控件
        isPrepared = true;
        lazyLoad();
        return view;
        }
        @Override
        protected void lazyLoad() {
            if(!isPrepared || !isVisible) {
                return;
            }
            //填充各控件的数据
        }
    }
    

      

    ------------------------------
    Brant Liu

    lbf1988@qq.com

    有梦想的码农
  • 相关阅读:
    《深入浅出WPF》4.0x名称空间
    《深入浅出WPF》3.0 XAML语法
    DataGridview 自动切换到 下一行
    C# 生成条形码图片,效果不错
    将DataTable 导出为csv
    DataTable,DataGridVIew转换到xls 方法 (转)
    NPOI读取Excel 数据 转。。。
    修改 字段大小
    VC
    统计每天 指定 时间段内 的数据
  • 原文地址:https://www.cnblogs.com/brantliu/p/4932067.html
Copyright © 2011-2022 走看看