大家还记得 Fragment 是什么时候发布的吗?在 2011 年 Google 发布 Android 3.0,伴随着 API 11 推出了 Fragment 组件,最初 Fragment 是为了优化 Android 平板页面结构而推出的,不幸的是 Android 平板现在几乎夭折了,连 Google 都放弃了 Android 平板的研发。
所以一直以来,Fragment 处于一种很尴尬的地位,API 难用、坑很多、生命周期难管理,所以当初有人提出 Activity 应该采取单 Activity + 多 Fragment 的结构开发时,很多人都持否定态度,不过最近 Google Play 也改成了这种结构,日常使用体验也还好。

不过自从 Android 平板上夭折之后,Fragment 的作用越来越向一个微型 Activity 发展,Activity 有什么方法 Fragment 中就要对应添加什么方法,发向 Activity 的事件回调也要向 Fragment 中发一遍。最初的想法是想 Fragment 解决 Activity 页面臃肿以及不灵活的问题,但是没想到如今 Fragment 变成了 Activity。

针对目前存在的问题,官方提出了重新设计 Fragment 的计划,并提出了以下两个目标:

将 Fragment 迁移到一个聚焦 API 层面的世界,并具有可预见、完善的表现。

兼容目前的功能

在未来的某个时间的,Google 会发布 Fragment 2.0,会添加一些新的 API 供大家使用,所以作为开发者的我们,需要密××× Fragment API 中哪些被打上了弃用的标签,因为在 Fragment 2.0 发布之后,这些 API 会逐步变得不可用。
现在的 Fragment

为了更方便的在 Fragment 中进行 UI 测试,Google 提供了 FragmentScenario UI 测试框架,使我们可以不依附于 Activity 单独测试 Fragment 的功能,同时也提供了 moveToState()、recreate() 等方法来测试生命周期变化时,Fragment 功能是否正常。

在目前的 1.1.0 版本中,还提供了 FragmentFactory 帮助我们自定义 Fragment 的实例化。之前我们可能会有一个疑问:为什么 Fragment 需要使用 setArguments 来传递参数,而不可以直接从 Fragment 的构造方法传递参数?答案很简单,会数据丢失。
因为例如当我们反转屏幕的时候,Activity 会销毁重建,当前 Activity 持有的 Fragment 会通过 FragmentManager 重建,但 FragmentManager 只会调用 Fragment 默认的构造方法重建,所以我们通过自定义构造方法传递的参数就会丢失。
现在我们可以通过 FragmentFactory 来自定义的实例化,就可以避免上述问题的发生。

自定义 FragmentFactory 之后,需要在 onCreate 之前给 FragmentManager 提前赋值。

在 Fragment 1.2.0 版本中,增加来新的 FragmentContainerView 来替代之前使用的 和 标签。FragmentContainerView 在 Fragmnet 出现、消失的动画上面增加了 Z 轴上的效果。

增加了 OnBackPressedDispatcher 来帮助我们在 Fragmnet 中更好的处理返回事件。

还有一些优化方面的更新,在 Fragment 中更方便的实例化不同作用域的 viewModel,例如仅 Fragment、全部 Navigation 作用域、Activity 作用域。同时在 FragmentPagerAdapter 中增加了 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 属性,表示只有当前 Fragment 可以走到 onResume,这样一来我们做 ViewPager 多个 Fragment 懒加载是就方便了很多。
未来的 Fragment

未来官方期望可以实现多个栈的 Fragment 状态管理,而不是像现在仅单一栈的管理,如果你目前正在基于 Android Arch Component 中的 Navigation 配合 BottomNavigationView(底部导航栏)写 App 的话,你应该明白目前这种结构的 Fragment 栈管理是多么痛苦。

这是官方自己实现的多个栈管理代码,在 GitHub 上面的 navigationadvancedsample 仓库中,有兴趣的可以自己研究下。

在未来官方还期望可以提供一种更好的 API 来代替 startActivityForResult 实现 Fragment 之间结果的传递。

最后官方还期望可以整合 Fragment 和 Fragment‘s View 的生命周期,提供更方便的状态管理。
其实在我看来之前 Fragment 之所以难用,是因为当时设计它的原因是基于平板模式所设计的,如今 Google 移除来 support 引入来全新的 AndroidX,将主要 API 的更新脱离 Android 版本的更新,势必会加快 API 的更新迭代速度,向着更快、更方便的开发体验前进,而且我也预感 Android 会在未来 1-2 年内会有重大的变化和突破,可以提供给用户媲美 iOS 的使用体验。所以抓紧上车,学就对了!
明天周末暂停更新,下周一我们继续为大家分享 Android Dev Summit 中有趣的内容!×××id丨Kotlin】!如果觉得这些文章有点意思,记得分享转发评论点赞鸭!