创建Fragment
完整的Fragment包含两部分:
- Fragment对象
- 布局
继承Fragment. fragment还支持V4兼容包用于兼容Android3.0之前的系统, 不过现在完全不需要去兼容4.0以下的Android系统了. 所以建议使用正常包.
|
|
普通的布局
|
|
Fragment是需要依附于Activity的”小Activity”, 所以需要添加到Activity中才能在界面显示. 支持两种方式添加, 其实原理都是一样.
动态添加
|
|
<fragment>
标签
通过直接在Activity中的布局添加标签的方式
这时可以看到右侧布局预览窗口提示
这是提示你没用设置该fragment具体显示内容. 因为你没用指定该fragment标签是显示什么内容, 可以点击提示输入.
|
|
默认显示内容是FragmentA
的内容, layout属性只是预览效果, 加与不加不影响实际效果.
关键类
Fragment
得到依附Activity实例
|
|
转场动画
这是为了支持Android5.0引入的Material Design过渡动画效果而添加的方法
|
|
得到转场动画
|
|
设置转场动画
|
|
Fragment的嵌套
得到FragmentManager
Fragment支持嵌套使用, 而该方法能得到Fragment内部的Fragment的管理器
|
|
该方法是得到把自己加到Activity里面的那个FragmentManager
|
|
得到父Fragment
|
|
Fragment的子类
Fragment的直接和间接的子类有几十个. 我后面慢慢补充吧. 其实大概用法和内容都差不太多.
DialogFragment
看我的一篇专门介绍Android的对话框文字.
FragmentManager
开启事务
Fragment是需要FragmentTransaction事务创建
|
|
得到Fragment
通过tag标签得到当前Activity显示的Fragment对象
|
|
通过id找到Fragment
|
|
返回栈
得到当前返回栈的Fragment数量
|
|
弹出返回栈, 相当于模拟按下返回键
|
|
监听返回栈的改变
|
|
用完以后记得删除返回栈的监听器
|
|
FragmentTransaction
负责Fragment的事务管理的类
添加Fragment
可以添加多个Fragment插入到Activity的容器中, 多个Fragment处于重叠状态按照添加顺序显示视图, 前两个方法实际都是调用的第三个方法.
|
|
替换容器
容器即Avtivity上的布局控件, 必须是ViewGroup的子类.
添加和替换Fragment的区别: 在于替换会先删除原有的再添加. 而添加可以重复添加不会删除.
|
|
隐藏和显示Fragment
隐藏已经存在Activity上的Fragment
|
|
显示之前隐藏的Fragment
|
|
分离和重建Fragment视图
分离并不是把把Fragment删除, 只是把Fragment的显示内容移除了而已.
|
|
添加到返回栈
如果执行了该方法, 在按下返回键后将退出当前Fragment而不是Activity
|
|
过渡动画
设置默认的动画效果
支持字段:
TRANSIT_NONE 无动画效果
TRANSIT_FRAGMENT_OPEN 默认的开启动画效果
TRANSIT_FRAGMENT_CLOSE 默认的关闭动画效果
TRANSIT_FRAGMENT_FADE. 渐隐效果
|
|
设置自定义的动画效果
|
|
提交事务
这个没什么好说的. 不提交的话一切操作都无效
|
|
与Activity的交互
Fragment内部提供方法getActivity()
直接获取其依附的Activity的实例. 借此数据传递或者是与该Activity上的其他Fragment进行交互都没有任何阻碍.
数据的保存和恢复
Fragment异常退出保存和恢复
保存和Activity一样
|
|
恢复数据重写以下方法即可
|
|
Fragment重建保存和恢复
在横竖屏切换或者Activity重建时, Activity其依附的Fragment也会同样的销毁重建. 一般会在AndroidManifest的Activity标签中加入属性android:configChanges="orientation"
禁止重新创建.
以下方法进行数据的保存和获取同样可以达到数据保存的目的.
|
|
Fragment对象保存和恢复
该方法在Activity重新创建的时候能够保存和恢复Fragment的实例对象.
|
|
使用这种方式进行实例的保存和恢复会导致Fragment的生命周期发生变化
- onDestroy方法不会被执行, 但是onDetach会执行
- onCreate不会执行
- 其他生命周期方法正常
应用场景:
有时候Activity利用onSavaInstanceState
来保存数据, 但是该方法是通过Bundle对象来存储数据的, Bundle对于大数据的处理会相当卡顿, 这个时候就需要用Fragment来进行保存和恢复. 如果单单是为了保存和恢复而创建的Fragment可以不需要创建布局文件. 因为不需要视图显示.
创建菜单
Fragment也提供和Activity一样的菜单创建和选择回调用法, 同样的支持向顶栏添加菜单, 不过在创建View对象之前调用setHasOptionsMenu(true);
, 否则无法创建菜单
|
|
生命周期
依附Activity生命周期
片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。
例如,当 Activity 暂停时,其中的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。和Activity同名的方法作用也相同.
我就介绍下不同的生命周期方法吧:
- onAttach方法:Fragment和Activity建立关联的时候调用。
- onCreateView方法:为Fragment加载布局时调用。
- onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
- onDestroyView方法:Fragment中的布局被移除时调用。
- onDetach方法:Fragment和Activity解除关联的时候调用。
场景演示
切换到该Fragment:
11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume
屏幕灭掉:
11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop
屏幕解锁
11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume
切换到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView
切换回本身的Fragment:
11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume
回到桌面
11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop
回到应用
11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume
退出应用
11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach