Fragment 的概念
关于
Fragment如何用浅显的语言来描述它呢,我认为就是:Activity就像是一个大屋子,大屋子里有很多房间,而这里的每个房间就是fragment,称为模块化的Activity.并且
fragment不能单独存在,必须依附于Activity;
fragment的生命周期受到外部Activity的影响;
fragment有自己的生命周期;
Fragment 优点
Fragment可以将Activity分离成多个可重用的组件,每个都有各自的生命周期和UI- 灵活的UI设计,可以适用于不同的屏幕尺寸,手机,平板
Fragment做为一个独立的模块可以轻松被Activity控制,添加,移除和替换Fragment切换流畅,比Activity之间切换要好
Fragment与Activity的通信方式
- 可以选择第三方的
EventBus等 setArugments方法(Activity向Fragment传递参数)- 自定义接口回调
- 当然也可以强制类型转化,例如:
((MainActivity)getActivity()).text; fragment中获取宿主MainActivity里的一个public字段。 - 在SDK26 的API 引入了
Activity.onAttachFragment(Fragment fragment), 可以将Activity的数据传递给Fragment.
Fragment 生命周期
放上一张官网 Fragment 的生命周期图:

挺清晰的,感觉和 Activity 的生命周期很像;
程序启动:
onAttach()---> onCreate()---->onCreateView()----onActivityCreate()--->onStart()----> onResume()上图显示Fragment已经处于运行Active状态后台状态:
onPause()---onStop()- 切换到其他
Fragment:onPause() ---> onStop() ---> onDestroyView(), 当再次切换回来的时候就不执行onCreate()了,直接从onCreateView()开始执行 - 锁屏:
onPause() ---> onStop() - 点亮屏幕:
onStart() ---> onResume() - 退出应用:
onPause() ---> onStop() ----> onDestroyView() -- > onDestroy() ----onDetach() - Home 键:
onPause() ---> onStop()
Fragment的add与replace的区别
1 | getSupportFragmentManager().beginTransaction() |
add 方式添加的 Fragment ,在切换 Fragment 的时候不会刷新 Fragment,但是 replace 方式在切换 Fragment 的时候会重新创建,它会销毁之前的那个,add 方式只是隐藏了而不是销毁了, 一般开发使用的是 add 方式。
用Fragment可能会遇到的问题
getActivity()为空我碰见这个问题的几率还挺大的,网上说是因为内存重启,重启的时候调用
getActivity()的地方返回null.
产生的原因:当调用了 getActivity() 时,当前 Fragment 已经 onDetach() 脱离了宿主 Activity.
解决的办法:当时在 stackoverflow 上看到过就是在使用之前先判断下 isAdd() 类似的方法
Fragment重叠异常正确使用 hide, show 的姿势。在类
onCreate()的方法加载Fragment, 并没有判断saveInstanceState == null, 导致重复加载了同一个Fragment导致重叠。
1 |
|
getFragmentManager,getSupportFragmentManager ,getChildFragmentManager三者之间的区别
getSupportFragmentManager() : 主要用于支持3.0以下的Android系统API版本,3.0以上系统可以直接使用
getFragmentManager(). 因为fragment是3.0以后才出现的组件,所以在3.0以下的设备使用v4 包中的getSupportFragment();getFragmentManager() : 得到所在fragment的父容器的管理器;
getChildFragmentManager() : 得到fragment里面子容器的管理器。
一般的使用场景
当
Fragment嵌套Fragment时,需要使用getChildFragmentManager()
FragmentPagerAdapter与FragmentStatePagerAdapter的区别与使用场景
对于经常使用
viewpager的应该大概都知道就是: 当viewpager中的fragment数量多的时候用FragmentStatePagerAdapter,同样当fragment比较少的时候,则使用FragmentPagerAdapter.
在 FragmentPagerAdapter 中的 destroyItem 中:
1 | public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { |
然后在看下 FragmentStatePagerAdapter 中的 destroyItem :
1 | public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { |