杨说:Fragment知识点总结

266 阅读4分钟

目录

一、Fragment存在的意义
二、Fragment生命周期
三、Activity和Fragment的区别
四、与Activity传参
五、Fragment间传参数据
六、Fragment其他问题

一、Fragment存在的意义

Fragment也是用于展示视图的,它必须跟Activity绑定在一起使用。Activity文章可查看 杨说:Activity知识点总结 。并拥有自己的生命周期。Activity如果onStop了那么Fragment是不能onStart的,如果Activity onDestroy那么Fragment也全部会onDestory。

Fragment在使用的时候必须要提供一个无参的构造函数

既然我们有了Activity为什么又要创造一个Fragment,Fragment的出现是为了分担Activity的视图控制的任务,并实现页面的复用

二、Fragment生命周期

2.1 Fragment生命周期

Fragment生命周期

onAttach() 在片段已与 Activity 关联时进行调用(Activity 传递到此方法内。
onCreateView() 调用它可创建与片段关联的视图层次结构。
onActivityCreated() 当 Activity 的 onCreate() 方法已返回时进行调用。
onDestroyView() 在移除与片段关联的视图层次结构时进行调用。
onDetach() 在取消片段与 Activity 的关联时进行调用。

2.2 Activity与Fragment生命周期对应关系

Activity的onCreate
对应Fragment的 onAttach onCreate 创建Fragment的时候调用此方法 onCreateView 第一次创建视图的时候调用此方法onActivityCreate
Activity的onStart
对应Fragment的 onStart
Activity的onResume
对应Fragment的 onResume
Activity的onPause
对应Fragment的 onPause
Activity的onStop
对应Fragment的 onStop
Activity的onDestory
对应Fragment的 onDestoryView onDestory onDetach

2.3 常见场景生命周期调用

1、启动一个含有Fragment的Activity
Activity onCreate onStart
Fragment onAttach onCreate onCreateView onActivityCreate
Activity onStart
Fragment onStart
Activity onResume
Fragment onResume
2、销毁一个含有Fragment的Activity
Activity onPause
Fragment onPause
Activity onStop
Fragment onStop
Activity onDestroy
Fragment onDestoryView onDestory onDetach
3、Fragment进入BackStack栈 onCreateView -> onActivityCreate -> onStart -> onResume 栈顶Fragment生命周期调用 onPause -> onStop -> onDestoryView

三、Activity和Fragment的区别

1、是否独立
Activity是单独的组件可独立存在、Fragment必须依附于Activity才能存在。因为Activity是组件所以必须在清单文件中注册,所以在混淆的时候不能混淆Activity但是能混淆Fragment
2、生命周期
Fragment因为依赖Activity所以生命周期比Activity多,比如onAttach onCreateView onActivityCreate onDestoryView onDettach
3、消耗资源
Activity在启动时,需要系统层参与消耗资源比较多。Fragment不需要跟系统层配合消耗资源少
4、回退栈
Activity的任务栈是由系统层AMS管理的,因为需要考虑夸进程。Fragment是由FragmentManager和FragmentTransaction管理,开启事务来实现add remove replace操作,如果没有将被替换Fragment放入backStack那么会销毁Fragment,否则只是停止。因为在同一个进程所以不需要考虑夸进程的问题,消耗资源也更少

四、与Activity传参

1、使用回调
2、使用ViewModel
3、使用事件总线 EventBus

五、Fragment间传参数据

5.1 同级别传递数据

接收方直接调用setFragmentResultListener接收回调,发送方使用setResult设置传参

5.2 父子关系传递数据

如需将结果从子级 Fragment 传递到父级 Fragment,父级 Fragment 在调用 setFragmentResultListener() 时应使用 getChildFragmentManager() 子级Fragment调用getParentFragmentManager() setResult 设置传参

六、Fragment其他问题

6.1 Fragment中add与replace的区别(Fragment重叠)

add不会重新初始化fragment,replace每次都会。所以如果在fragment生命周期内获取获取数据,使用replace会重复获取
添加相同的fragment时,replace不会有任何变化,add会报IllegalStateException异常
replace先remove掉相同id的所有fragment,然后在add当前的这个fragment,而add是覆盖前一个fragment。所以如果使用add一般会伴随hide()和show(),避免布局重叠
使用add,如果应用放在后台,或以其他方式被系统销毁,再打开时,hide()中引用的fragment会销毁,所以依然会出现布局重叠bug,可以使用replace或使用add时,添加一个tag参数

6.2 getFragmentManager、getSupportFragmentManager 、getChildFragmentManager之间的区别

getFragmentManager()所得到的是所在fragment 的父容器的管理器
getChildFragmentManager()所得到的是在fragment 里面子容器的管理器,如果是fragment嵌套fragment,那么就需要利用getChildFragmentManager()
因为Fragment是3.0 Android系统API版本才出现的组件,所以3.0以上系统可以直接调用getFragmentManager()来获取FragmentManager()对象,而3.0以下则需要调用getSupportFragmentManager() 来间接获取;

6.3 FragmentPagerAdapter与FragmentStatePagerAdapter的区别与使用场景

相同点 :
二者都继承PagerAdapter
不同点 :
FragmentPagerAdapter的每个Fragment会持久的保存在FragmentManager中,只要用户可以返回到页面中,它都不会被销毁。因此适用于那些数据相对静态的页,Fragment数量也比较少的那种
FragmentStatePagerAdapter只保留当前页面,当页面不可见时,该Fragment就会被消除,释放其资源。因此适用于那些数据动态性较大、占用内存较多,多Fragment的情况;

参考

1、Android官方文档
2、小专栏《重学安卓》
3、Android篇:2019初中级Android开发社招面试解答(上)