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) { |