一、概念
(1)Fragment是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间。
(2)一般建议使用support-v4库中的Fragment,因为它可以让碎片在所有Android系统版本中保持功能一致。
(3)通过LayoutInflater的inflate()方法加载fragment布局。
(4)Fragment必须被嵌入一个Activity中,它们的生命周期直接受宿主Activity的影响。
(5)当一个Activity正在运行时,可以独立地操作其中的每一个Fragment,如添加或删除。
注:Fragment的特点
Fragment的设计主要是把Activity界面包括其逻辑打碎成很多个独立的模块,这样便于模块的重用和更灵活地组装,呈现出多样的界面。
(1)Fragment可以作为Activity界面的一个部分组成。
(2)可以在一个Activity里面出现多个Fragment,并且一个Fragment可以在多个Activity中使用。
(3)在Activity运行中,可以动态地添加、删除、替换Fragment。
(4)Fragment有自己的生命周期的,可以响应输入事件。
二、静态加载碎片
静态加载只需要把Fragment当成普通的UI控件放到界面Layout中。
三、动态加载碎片
动态加载碎片的步骤:
①创建待添加的碎片实例;
②获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方法得到;
③开启一个事务,通过调用beginTransaction()方法开启;
④向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例;
⑤提交事务,调用commit()方法来完成;
注:FragmentTransaction中提供了一个addToBackStack()方法,可以用于将一个事务添加到返回栈中。
四、碎片和活动之间的通信
1、在Activity中获取Fragment实例
若Activity中包含自己管理的Fragment引用,可以直接访问Fragment的公有方法进行相应操作。
若Activity中未保存Fragment的引用,则通过getFragmentManager().findFragmentByTag()或者findFragmentById()获得相应Fragment实例,然后进行操作。
①活动→findFragmentById()→碎片
②FragmentManager提供了一个类似于findViewById()方法的findFragmentById()方法(专门用于从布局文件中获取碎片的实例),可以在活动中得到相应碎片的实例,然后就可以轻松调用碎片里的方法了。
2、在Fragment中获取Activity实例
在Fragment中可以通过getActivity()方法得到当前绑定的Activity实例,然后进行相应的操作。
注意:在Fragment中可以通过getActivity()方法来获取Context,若需要让Context在Activity被销毁后还存在,则可以用getActivity().getApplicationContext()来获取。
①碎片→getActivity()→活动
②在每个碎片中都可以通过getActivity()方法来得到和当前碎片相关联的活动实例。
五、碎片的状态
1、运行状态:当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。
2、暂停状态:当一个活动进入暂停状态时,与它相关联的可见碎片就会进入到暂停状态。
3、停止状态:当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态,或者通过FragmentTransaction的remove()、replace()方法将碎片从活动中移除。
4、销毁状态:碎片总是依附于活动的存在而存在,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。
六、碎片的生命周期
onAttach():当碎片和活动建立关联的时候调用
onCreate():当第一次创建碎片的时候调用
onCreateView():为碎片创建视图(加载布局)时调用
onActivityCreated():确保与碎片相关联的活动一定已经创建完毕的时候调用,也就是当Activity中的onCreate()方法执行完后调用
onStart():碎片从不可见变为可见时调用
onResume():碎片准备好与用户进行交互时调用
onPause():碎片处于暂停状态时调用
onStop():碎片处于停止状态时调用
onDestroyView():碎片中视图被移除时调用
onDestroy():碎片销毁之前调用
onDetach():当碎片和活动解除关系的时候调用
注:在碎片中可以通过onSaveInstanceState()方法来保存数据,因为进入停止状态的碎片有可能在系统内存不足时被回收。保存下来的数据可以在onCreate()、onCreateView()和onActivityCreated()这3个方法中重新得到,它们都含有一个Bundle类型的savedInstanceState参数。
七、多Fragment切换
1、如何切换Fragment?
首先分别获取FragmentManager与FragmentTransaction的实例,然后创建一个Fragment实例,接下来调用FragmenTransaction对象的replace()方法与commit()方法来完成Fragment的切换。如下:
2、切换优化
虽然上述方法可以切换Fragment,但是面对大量点击来回切换,或者本来就有非常多的Fragment,会导致OOM。
1、预加载模式
在加载第一个Fragment时就把全部Fragment加载好。下次直接调用。
2、动态加载模式
所有的Fragment只实例化一次,实例化的Fragment会被存入内存,下次切换会判断内存中是否含有要切换的Fragment,如果有就直接复用,没有就add一个新的。





































苏公安网备 32011402010933号