oynix

于无声处听惊雷,于无色处见繁花

Android Fragment

原文地址

原作者的slogan是,喜欢写又臭又长的文章。这篇文章确实长的很,洋洋洒洒上万字,就这字数就过滤掉了很大一部分人,但是我喜欢。写的很好,里面内容有旧也有新,担心哪天点开这链接弹出来个404,所以摘抄点出来。

生命周期

Fragment中有两个生命周期,一个自身的生命周期,另一个是其所包含的View的生命周期,其中的View是可以多次被创建和销毁的,所以在使用ViewModel时,要将数据与View的生命周期相关联。

回退栈

增加/移除/替换Fragment都是基于事务进行的,当提交事务时,将事务添加到了回退栈,那么在将事务从回退栈中弹出时,FragmentManager就会reverse its operation,反向执行事务的操作,也就是恢复成该事务执行之前的状态。按下返回键,如果回退栈不为空,则回退栈就会弹出事务来响应返回按钮事件。当然,也可以不将事务加到回退栈中。相关接口:

1
2
3
FragmentTransaction.addToBackStack
FragmentTransaction.popBackStack
FragmentTransaction.disallowAddToBackStack

registerForActivityResult

startActivityForResultonActivityResult都已经废弃,registerForActivityResult是官方推荐的从Activity获取数据的方式,新方式变得灵活了不少,如下:

  • 创建ActivityResultContract<I, O>的实例,声明输入/输出数据,需要实现里面的抽象方法。createIntent方法用来获取跳转的Intent,parseResult用来处理返回的数据
  • 创建ActivityResultCallback<O>接口实例,用来处理返回的数据,里面只有一个方法onActivityResult
  • 最后调用ComponentActivity中方法registerForActivityResult(contract, callback)把前两步创建的参数传入即可

Fragment Result

在FragmentManager有这样一组方法,可以进行数据通信:

1
2
3
public final void setFragmentResultListener(String requestKey, LifecycleOwner lifecycleOwner, FragmentResultListener listener)

public final void setFragmentResult(String requestKey, Bundle result)

简单说,就是在观察者模式的基础上,加上了生命周期的管理,不管是Activity还是Fragment,只要能获取到同一个FragmentManager就可以通信。需要注意的是,里面保存key和listener用的是Map<String, FragmentResultListener>,所以一个key只能有一个listener,后面的会把前面的覆盖。

Fragment中监听返回按键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class PlaceholderFragment(private val sectionNumber: Int) :
Fragment(R.layout.fragment_placeholder) {

private val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
//TODO
}
}

override fun onAttach(context: Context) {
super.onAttach(context)
requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
}
}

其他用途

  • Fragment可设置内部的UI View,也可以不设置。当不设置时,可用其来监听生命周期,其中LifeCycle、Glide用的便是这种方式。
  • 也可以用作方法代理,请求权限,可将请求与处理放到一起处理,而不是像registerForActivityResult分开处理。FragmentTransaction的add方法都有多个重载方法,支持只添加一个Fragment,若此Fragment无View,则对用户来说是无感的,但对于我们来讲可以在其中处理一些业务。
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2021/09/8810331e150a/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道