Fragment介绍:

      这几天刚好有闲暇的时间,所以打算把平常用到的和遇到的关于fragment的应用做一个总结吧;

      一、fragment的生命周期, 这是刚打开fragment时的执行日志:

Fragment介绍:_第1张图片

       初次创建fragment时:

      onAttach:当fragment和activity产生关联的时候调用

      onCreate:和activity一样,是当fragment创建时调用

      onCreateView:加载view,并将view对象并返回

      onActivityCreated:当activity被创建成功时调用

      onStart:结合activity当fragment可见时调用

      onResume:当获取焦点时调用

Fragment介绍:_第2张图片

       fragment退出时:

      onPause:失去焦点时调用

      onStop:界面不可见时调用

      onDestroyView:回收view对象时调用

      onDestroy:fragment被销毁时调用

      onDetach:取消fragment和activity的关联时调用

       无论是activity还是fragment,一个完整的生命周期,都会经历:创建、界面可见、获取焦点、失去焦点、界面不可见、销毁。

因为我们知道fragment是必须关联到activity来使用的,所以这2者的生命周期还是有一些相似的地方。

       创建时:

       activity :onCreate

       fragment:onAttach、onCreate、onCreateView、onActivityCreated

         界面可见时:

          activity:onStart

          fragment:onStart

         获取焦点时:

        activity:onResume

        fragment:onResume

        界面不可见时:

        activity:onPause

        fragment:onPause

        失去焦点时:

         activity:onStop

         fragment:onStop

         销毁时:

        activity:onDestroy

        fragment:onDestroyView、onDestroy、onDetach

        二、fragment的使用:

        主要是静态使用和动态使用2种方式。静态使用就像其他控件一样直接在xml布局中使用。

         如下:       

    <fragment

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.example.administrator.gallerydemo.Fragment1"/>
    注意:在布局中使用的时候必须要加name这个属性,引用对应的fragment到布局中。
    动态添加,主要是通过FragmentTransaction来动态添加。如下:
    transaction.add(new Fragment5(),"fragment").commitAllowingStateLoss();
    transaction.replace(R.id.root_rly,new Fragment5()).commitAllowingStateLoss();
    三、fragment的懒加载:
 fragment和viewpager是Android中一个比较普遍的应用场景。在实际开发中,为了节约用户流量,我们往往需要限制fragment的数据加载,就是当fragment进入到可见的状态时,才需要去加载数据。所以我们可以继承Fragment,重写setUserVisibleHint
@Override public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(getUserVisibleHint())
    {
        isVisible=true;
        onVisible();
    }else  {
        isVisible=false;
        onInVisible();
    }
}

 protected void onInVisible()
  {

  }


    
    
    
    
protected void onVisible(){
        lazyLoad();
    }
 
protected abstract void lazyLoad();
这里当界面可见的时候,我们就可以调用onVisible,再调用lazyLoad懒加载的方法。之所以不直接调用懒加载的方法,是为了提高代码的复用性。由于setUserVisibleHint是在onCreateView之前调用的,那么在视图未初始化的时候,在lazyLoad当中就使用的话,就会有空指针的异常。所以我们在使用的时候,需要这样做:http://

   
   
   
   
public class OpenResultFragment extends LazyFragment{
     // 标志位,标志已经初始化完成。
     private boolean isPrepared;
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         Log.d(LOG_TAG, "onCreateView" );
         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 ;
         }
         //填充各控件的数据
     }
 
}

      参考:fragment的懒加载

你可能感兴趣的:(android)