一、FragmentManager的获取
- getSupportFragmentManager是FragmentActivity下的方法获取FragmentManager
- getParentFragmentManager是Fragment的方法,获取父类的FragmentManager,有可能是Activity也有可能是Fragment
- getChildFragmentManager是Fragment的方法,获取当前Fragment的FragmentManager
二、FragmentFactory
以前Fragment的构造函数不允许携带参数,因为Fragment会由系统自动创建,例如xml创建,Activity被杀死重建等。
现在可以通过给FragmentManager设置FragmentFactory,重写instantiate方法来创建Fragment,可以添加带参数的构造函数。
注意:FragmentFactory 的设置必须在 super.onCreate 之前,因为当 Activity 进入重建路径时,会在 super.onCreate 中使用到它。
三、使用FragmentContainerView作为Fragment的容器
Framelayout的子类,官方推荐使用,解决了Fragment转场动画的一些问题
四、Fragment使用Viewpager2
- ViewPager 中使用
PagerAdaper,ViewPager2 中使用Recyclerview.Adapter - ViewPager 中使用
FragmentPagerAdapter,ViewPager2中使用FragmentStateAdapter - ViewPager 中使用
FragmentStatePagerAdapter,ViewPager2中使用FragmentStateAdapter
实现Fragment懒加载,最新Fragment版本推荐使用setMaxLifecycle,setUserVisibleHint方法已经过期,如果使用Viewpager2,使用FragmentStateAdapter构造方法中传入BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 默认支持懒加载。
五、不同事务操作
add & remove:Fragment 状态在 INITIALIZING 与 RESUMED 之间转移;
detach & attach: Fragment 状态在 CREATE 与 RESUMED 之间转移;
replace: 先移除所有 containerId 中的实例,再 add 一个 Fragment;
show & hide: 只控制 Fragment 隐藏或显示,不会触发状态转移,也不会销毁 Fragment 视图或实例;
hide & detach & remove 的区别: hide 不会销毁视图和实例、detach 只销毁视图不销毁实例、remove 会销毁实例(自然也销毁视图)。不过,如果 remove 的时候将事务添加到回退栈,那么 Fragment 实例就不会被销毁,只会销毁视图。
六、Fragment生命周期
七、FragmentViewLifecycle
Fragment 相对于 Activity 来说比较特殊,因为其关联的 View 对象可以在单次 FragmentLifecycle 过程中先后多次加载和销毁,因此实际上 FragmentView 的生命周期和 Fragment 并不同步。
Fragment 提供了一个getViewLifecycleOwner()方法由于提供 FragmentViewLifecycle,从中可以看出该方法只能在 onCreateView() 到 onDestroyView() 之间被调用,即只能在 FragmentView 创建了且销毁之前使用,否则将直接抛出异常。
Fragment定义五种状态:
static final int INITIALIZING = 0; 初始状态,Fragment 未创建
static final int CREATED = 1; 已创建状态,Fragment 视图未创建
static final int ACTIVITY_CREATED = 2; 已视图创建状态,Fragment 不可见
static final int STARTED = 3; 可见状态,Fragment 不处于前台
static final int RESUMED = 4; 前台状态,可接受用户交互
八、Fragment返回键处理
class MyFragment : Fragment() {
override fun onAttach(context: Context) {
super.onAttach(context)
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Do something
}
}
requireActivity().onBackPressedDispatcher.addCallback(this, callback)
}
}
九、Fragment Result API
FragmentManager的方法:
-
setFragmentResult 方法表示的是向 requestKey 下发数据
-
setFragmentResultListener 表示的是对 requestKey 进行监听