Fragment为什么成为第五大组件
Fragment为什么成为第五大组件
四大组件:Activity、Service、Broadcast Receiver、Content Provider
Fragment具有生命周期,使用广泛
Fragment加载到Activity的两种方式
- xml通过fragment标签引入的方式
- code中动态添加
FragmentPagerAdapter和FragmentStatePagerAdapter
- FragmentPagerAdapter的destroyItem的时候并没有直接销毁item,只是分离了UI
- FragmentStatePagerAdapter是直接销毁了Fragment
- Fragment多的时候选择FragmentStatePagerAdapter,少的时候选择FragmentPagerAdapter
Fragment的生命周期
Framgnet之间的通信
- Fragment通过getActivity获取到Activity
- Fragment实现接口,Activity通过接口来管理
- 两个Fragment之间通过广播来传输数据
- 使用事件总线传递数据
Framgnt管理器:FragmentManger
如何获取FragmentManger
- Activity 中通过getSupportFragmentManager获取
- Fragment中通过getChildFragmentManager获取
常用方法
- add 添加一个Fragment实例
- remove 移除一个Fragment实例
- replace 替换一个Fragment实例
ViewPager加载Fragment如何实现页面可见再加载数据
ViewPager是默认缓存1的pager,也就是默认加载隔壁的Fragment。而mOffscreenPageLimit这是默认为1的,且setOffscreenPageLimit传入的数据小于1也会默认赋值为1。以下是两种实现方式:
从ViewPaer
- 重写整个ViewPager,将mOffscreenPageLimit赋值为0
- 通过反射获取mOffscreenPageLimit的值,然后进行赋值
从Fragment
- 定义isCreate变量默认为false
- 在onCreate方法中赋值为true
- 重写setUserVisibleHint方法,代码如下
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser && isCreate) {
isCreate = false
// todo you something
}
}
- ViewPager的mOffscreenPageLimit设置为mFragments的大小
- 需要注意:第0个Framgnet不能使用上面的方法,需要特殊处理,onCreate中判断Fragment的下标赋值isCreate的值
如何获得Fragment的实例
- 保留空构造方法,否则会在某些情况下抛出错误:make sure class name exists, is public, and has an empty constructor that is public
- 不要直接不要直接通过new的方式获取,应该使用:newInstance方式来获取,以下是kotlin示例:
companion object {
/**
* 获取PartyBillHandledFragment的实例
*/
fun newInstance(): PartyBillHandledFragment {
val args = Bundle()
val fragment = PartyBillHandledFragment()
fragment.arguments = args
return fragment
}
}
startActivityForResult之坑
- 在Fragment中请勿使用getActivity().startActivityForResult(),这样Framgnet中的onActivityResult是接收不到回调,而是回调Activity的onActivityResult。
- 正确的应该是直接使用startActivityForResult()方法
- requestCode请勿传-1