Fragment 的如今以及将来

你们还记得 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 的计划,并提出了如下两个目标:优化

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

  2. 兼容目前的功能spa

在将来的某个时间的,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 的构造方法传递参数?答案很简单,会数据丢失。3d

由于例如当咱们反转屏幕的时候,Activity 会销毁重建,当前 Activity 持有的 Fragment 会经过 FragmentManager 重建,但 FragmentManager 只会调用 Fragment 默认的构造方法重建,因此咱们经过自定义构造方法传递的参数就会丢失。cdn

如今咱们能够经过 FragmentFactory 来自定义的实例化,就能够避免上述问题的发生。blog

自定义 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 中有趣的内容!没关注的小伙伴记得关注我以及个人公众号【Android丨Kotlin】!若是以为这些文章有点意思,记得分享转发评论点赞鸭!

我是 wanbo 你们加油!