原文地址
原作者的slogan是,喜欢写又臭又长的文章。这篇文章确实长的很,洋洋洒洒上万字,就这字数就过滤掉了很大一部分人,但是我喜欢。写的很好,里面内容有旧也有新,担心哪天点开这链接弹出来个404,所以摘抄点出来。
生命周期
Fragment中有两个生命周期,一个自身的生命周期,另一个是其所包含的View的生命周期,其中的View是可以多次被创建和销毁的,所以在使用ViewModel时,要将数据与View的生命周期相关联。
回退栈
增加/移除/替换Fragment都是基于事务进行的,当提交事务时,将事务添加到了回退栈,那么在将事务从回退栈中弹出时,FragmentManager就会reverse its operation,反向执行事务的操作,也就是恢复成该事务执行之前的状态。按下返回键,如果回退栈不为空,则回退栈就会弹出事务来响应返回按钮事件。当然,也可以不将事务加到回退栈中。相关接口:
1 | FragmentTransaction.addToBackStack |
registerForActivityResult
startActivityForResult
和onActivityResult
都已经废弃,registerForActivityResult
是官方推荐的从Activity获取数据的方式,新方式变得灵活了不少,如下:
- 创建
ActivityResultContract<I, O>
的实例,声明输入/输出数据,需要实现里面的抽象方法。createIntent
方法用来获取跳转的Intent,parseResult
用来处理返回的数据 - 创建
ActivityResultCallback<O>
接口实例,用来处理返回的数据,里面只有一个方法onActivityResult
- 最后调用ComponentActivity中方法
registerForActivityResult(contract, callback)
把前两步创建的参数传入即可
Fragment Result
在FragmentManager有这样一组方法,可以进行数据通信:
1 | public final void setFragmentResultListener(String requestKey, LifecycleOwner lifecycleOwner, FragmentResultListener listener) |
简单说,就是在观察者模式的基础上,加上了生命周期的管理,不管是Activity还是Fragment,只要能获取到同一个FragmentManager就可以通信。需要注意的是,里面保存key和listener用的是Map<String, FragmentResultListener>
,所以一个key只能有一个listener,后面的会把前面的覆盖。
Fragment中监听返回按键
1 | class PlaceholderFragment(private val sectionNumber: Int) : |
其他用途
- Fragment可设置内部的UI View,也可以不设置。当不设置时,可用其来监听生命周期,其中LifeCycle、Glide用的便是这种方式。
- 也可以用作方法代理,请求权限,可将请求与处理放到一起处理,而不是像
registerForActivityResult
分开处理。FragmentTransaction的add
方法都有多个重载方法,支持只添加一个Fragment,若此Fragment无View,则对用户来说是无感的,但对于我们来讲可以在其中处理一些业务。