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处于运行状态,可以管理其控件