activity调用fragment的方法_Fragment 的现在以及未来

v2-fb1e92703b7b0da0419f94d6c76f6d95_1440w.jpg?source=172ae18b

大家还记得 Fragment 是什么时候发布的吗?在 2011 年 Google 发布 Android 3.0,伴随着 API 11 推出了 Fragment 组件,最初 Fragment 是为了优化 Android 平板页面结构而推出的,不幸的是 Android 平板现在几乎夭折了,连 Google 都放弃了 Android 平板的研发。

所以一直以来,Fragment 处于一种很尴尬的地位,API 难用、坑很多、生命周期难管理,所以当初有人提出 Activity 应该采取单 Activity + 多 Fragment 的结构开发时,很多人都持否定态度,不过最近 Google Play 也改成了这种结构,日常使用体验也还好。

v2-5ebaa770391db5afc1ef39f8455dc4ca_b.jpg

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

v2-c5ed382921b0b6f3d05f984138015e0e_b.jpg

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

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

2. 兼容目前的功能

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

现在的 Fragment

v2-96022f0bef6cb1a6745f4b766c08dc23_b.jpg

v2-8e56d98823eb527c8a50519332166fc8_b.jpg

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

v2-2ce6bfe694db202297b637bce440e695_b.jpg

在目前的 1.1.0 版本中,还提供了 FragmentFactory 帮助我们自定义 Fragment 的实例化。之前我们可能会有一个疑问:为什么 Fragment 需要使用 setArguments 来传递参数,而不可以直接从 Fragment 的构造方法传递参数?答案很简单,会数据丢失。

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

现在我们可以通过 FragmentFactory 来自定义的实例化,就可以避免上述问题的发生。

v2-5f4ae23f9b53e9436c95687fd8a939c3_b.jpg

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

v2-fd52d78b754aa029ce06317deacb0040_b.jpg

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

v2-556cb66e057271ba3e12557d491df82b_b.jpg

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

v2-7a21bb3a6411686d2ed201b08ac0b415_b.jpg

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

未来的 Fragment

v2-beb0b2d80a32ad8c12c1ff70d4845a42_b.jpg

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

v2-06df2919313ded7078165965cfe6dfed_b.jpg

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

v2-50b5090f4f9ab834922cd020b8f2d38a_b.jpg

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

v2-7611c2f84808a79893fe1e0f8df6e372_b.jpg

最后官方还期望可以整合 Fragment 和 Fragment‘s View 的生命周期,提供更方便的状态管理。

其实在我看来之前 Fragment 之所以难用,是因为当时设计它的原因是基于平板模式所设计的,如今 Google 移除来 support 引入来全新的 AndroidX,将主要 API 的更新脱离 Android 版本的更新,势必会加快 API 的更新迭代速度,向着更快、更方便的开发体验前进,而且我也预感 Android 会在未来 1-2 年内会有重大的变化和突破,可以提供给用户媲美 iOS 的使用体验。所以抓紧上车,学就对了!

明天周末暂停更新,下周一我们继续为大家分享 Android Dev Summit 中有趣的内容!没关注的小伙伴记得关注订阅鸭!如果觉得这些文章有点意思,记得分享转发评论点赞鸭!

我是 wanbo 大家加油!

v2-9f6b6b3e0914b248d1de673baeb4f713_b.jpg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值