Fragment之踩坑过程

3,072 阅读3分钟

Fragment的基本概念

fragement是Android3.0引入的API,号称是为了解决屏幕碎片化和帮助重用代码的构造。中文翻译为 碎片、片段,或者理解成子Act,相比Activity更轻量级、更灵活。

fragment依赖activity,不能独立存在。一个activity可以拥有多个fragment,并且同一个fragment可以被多个activity重用。

Fragment生命周期

  • onAttach:fragment关联到activity,此时activity已经传进来了,可以使用getactivity来和宿主activity进行通信,只调用一次
  • onCreate:系统创建fragment的时候回调该方法,在里面实例化一些变量,在这里定义的变量会在pause、stop时保持数据,只调用一次。如果想为fragment开启一个后台线程,可以在该方法里写。
  • onCreateView:第一次使用fragment的时候,就会在此加载fragment布局,为了画控件,要返回一个view。尽量不要在该方法里写很多耗时的操作。
  • onActivityCreated:activity的oncreate结束后调用该方法,因此不要再oncreateview方法中和activity进行ui交互操作,可以在该方法中和activity进行交互
  • onStart:fragment启动时回调,此时fragment可见
  • onResume:fragment获得焦点
  • onPause:用户离开这个fragment,但没有销货
  • onStop:activity被stopped了 OR fragment被移除但被加入到回退栈中,一个stopped的fragment仍然是活着的如果长时间不用也会被移除
  • onDestroyView:fragment的布局被移除的时候回调,
  • onDestroy:销毁fragment对象
  • onDetach:解除和activity的关联

注意:使用和不使用回退栈的区别:

如果不使用回退栈,oldFragment会依次执行onDestroyView ->onDestroy->onDetach;如果使用回退栈,oldFragment只会执行到onDestroyView就开始加载新的fragment,oldfragment没有被杀掉

Fragment的创建

创建fragment有两种方法,一是静态添加,二是动态添加。

1、静态添加fragment

2、动态添加fragment

注意:静态添加的fragment在运行时不能删除,动态添加比较灵活建议使用。

Fragment的交互

Fragment使用时需要注意的地方

1、fragment有很多方法可以重写,最常用的是onCreateView

 @Override

     public View onCreateView(LayoutInflater inflater, ViewGroup container,

                              Bundle savedInstanceState) {

         // Inflate the layout for this fragment

         View root=inflater.inflate(R.layout.fragment_edit_info_home,container,false);

         return root;

     }

注意第三个参数是false,因为在fragment内部实现中会把布局添加到container中,如果是true,就会添加两次而抛出异常。

2、如果在创建Fragment时要传入参数,可以通过setArguments(Bundle bundle)方式添加,因为使用该方法,即使fragment因为内存紧张被杀掉,恢复的时候能保留数据。

3、不要在onCreateView中定义fragment控件,要在onActivityCreated中定义,因为调用onCreateView时,activity的onCreate还没完成

4、如果需要使用嵌套fragment,要在fragment的onstart方法中获得getChildFragmentManager,为什么不能在onctivityCreated中获得呢?因为此时fragment还没运行,只是activity运行了,在onstart方法中,fragment处于运行状态,可以管理其控件