1.Fragment的介绍
(Fragment英语翻译为碎片,片段。在我的直观想象中,Fragment它就像是那种魔法碎片一样,可以自由变换,自由组合)
Fragment是在Android 3.0版本引入的概念,是为了支持平板设备上更加灵活的UI设计。简单的说,它就像是activity的一个模块零件,通过它,可以利用屏幕空间设计出更合理的UI搭配。
要点:
- Activity界面可以由不同的Fragment组成 (宋体 四号)
- Fragment 拥有自己的生命周期并且可以接收、处理用户事件
Fragment可以静态和动态添加与移除。
掌握Fragment,则必须搞清楚几个重要的概念:Fragment的生命周期、Fragment回退栈(又是一个栈结构,和Activity的栈结构或许相似)、Fragment事务,掌握了这些,接下来就是Fragment的一些特殊用法以及最佳实践,还有可能会遇到的各种坑啦。
2.Fragment的生命周期
- 生命周期
- 各个方法的回调时机
onAttach() Fragment和Activity建立关联的时候调用
onCreate()
onCreateView()为Fragment加载布局时调用
onActivityCreated()当宿主Activity中的onCreate()方法执行完毕后调用
onStart() 当Fragment与用户可见时
onResume() 当Fragment准备好与用户交互时
onPause() 碎片不再与用户交互,因为其活动被暂停或者在活动中修改片段的操作
onStop() 与onPause()相同,此时不可见
onDestroyView() Fragment中的布局被移除时调用
onDestroy() 对碎片做最后的清理操作时调用
onDetach() Fragment和Activity解除关联的时候调用
按使用场景打印生命周期的回调
运行APP: onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
按下home键:
onPause()
onStop()
重新进入:
onStart()
onResume()
按下back键退出程序
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
3.Fragment回退栈
在官方文档找到了一段对回退栈的描述:当宿主Activity处于onResume状态时,你可以单独操控fragment,比如添加或删除,当执行这样的一项事务时,可以将它添加到后台的一个栈中,这个栈由activity管理;activity里面的每个回退栈内容是fragment发生过的一条事务记录,此后回退栈允许用户通过按back键回退一项fragment事务。
addToBackStack(String);
当加入回退栈之前hide replace方法的使用:
hide当不希望视图重绘的时候
replace 会重绘
4.Fragment与Activity通信的最佳实践
这里我觉得鸿洋前辈的方法很好,使用接口回调的方式,把Fragment里组件的事件处理交给宿主Activity处理。降低Fragment与Activity的耦合,做到Fragment的重复使用
5.Fragment特殊用法
- Fragment与ActionBar和MenuItem集成宿主Activity的Menu和Fragment的Menu叠加显示,并且可以各自控制自己的菜单事件.
- 没有布局的Fragment:
当Activity重合时,为了保存大量数据。 DialogFragment对话框(Android3.0引入,方便管理)
使用Dialog的两种方式:
1.实现onCreateView() 在此方法中加载对话框的布局.(Tips:去掉标题框getDialog().requestWindowFeature(Window.FEATURE_NO_TITILE))
2.实现onCreateDialog()在这里使用AlertDialog创建对话框
传递数据给Activity
使用接口回调的方式,在对话框的按钮事件中处理。
DialogFragment屏幕适配
设想这样的需求:一个对话框在大屏幕上以对话框的形式显示,而小屏幕上则直接嵌入当前的Activity中:
方法:1.通过重写onCreateView来设置布局文件
2.在默认的values下新建一个bools.xml 设置属性为false
3.然后在res下新建一个values-large文件,在其下也新建一个bools.xml 设置属性为true(表示大屏)
屏幕旋转数据恢复
如果是直接使用new AlertDialog()创建对话框,则当屏幕旋转时,第一不会保存用户输入的值,第二还会报异常,因为Activity销毁前不允许对话框未关闭;而使用DialogFragment的方式则不必考虑此问题。