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

    有梦想的码农
  • 相关阅读:
    c# winform 应用编程代码总结 5
    c# winform 应用编程代码总结 6
    C语言 如何隐藏DOS窗口
    c# winform 应用编程代码总结 13
    c# winform 应用编程代码总结 8
    c# winform 应用编程代码总结 7
    c# winform 应用编程代码总结 10
    Ext grid改变行背景颜色 和改变行字体颜色
    我的博客学习记录一箩筐(每天更新)
    New version of wxDesigner based on wxWidgets pre3.0 released
  • 原文地址:https://www.cnblogs.com/brantliu/p/4932067.html
Copyright © 2011-2022 走看看