Android P中已弃用片段技术

66

我在查看文档时发现了这个:

该类已在 Android P 中废弃。

为什么 Android P 中废弃了片段 (Fragment)?


18
那些已经给负评或正考虑给负评的人,能否请您也给一个合理的理由?我认为这是一个真诚的问题,可以为我们提供一些深入的答案。 - RoyalGriffin
1
只有向做事的人提问才有意义。在这种情况下,您必须向谷歌提问。 - The incredible Jan
2
在2018年仍然有必要使用Fragment吗?现在只有支持实现在运行,那么应该使用什么替代品呢? - DaniloDeQueiroz
4
@RoyalGriffin,投反对票的人是仇恨者。他们无法解释自己的行为,只会看到SO的规则(这些规则并不合理),然后打上减号并要求管理员关闭或删除一个问题(有时还包括正确的答案)。 - CoolMind
3
谷歌的代表在 Stack Overflow 上阅读并与 Android 相关的问题互动,因此这是正确的论坛。 - TWiStErRob
显示剩余4条评论
4个回答

32

支持库 27.1.0 中的重构

Ian 的 Medium 文章(2018 年 2 月 28 日)为我们解释了相关内容。他是谷歌 Android 框架开发人员。

支持库 27.1.0 中的加载器

为了支持库 27.1.0,我重新编写了 LoaderManager 的内部实现,这个类支持 Loaders API。我想解释一下这些更改背后的原因以及未来可以期待什么。

加载器和片段,一个历史
从一开始,加载器和片段就紧密地联系在一起。这意味着尽管它们确实是相对独立的,但 FragmentActivity 和 Fragment 中的很多代码都是为了支持加载器而存在的。…

27.1.0 中的变化
在 27.1.0 中,加载器技术债务已大大减少:…

注意:显然,这些更改仅适用于支持库加载器。如果您正在使用 Android 框架加载器,请尽快切换到支持库加载器。框架加载器 API 没有计划进行错误修复或改进。

似乎已经重构了FragmentFragmentActivity的代码以使加载器成为可选依赖项。

根据发行说明,新实现基于 Lifecycle

重要变更
Loaders的底层实现已经被重新编写,以使用Lifecycle

架构组件

Support Library 26.1.0中,FragmentFragmentActivity已经采用了Lifecycle

这是一个特殊的版本,将Support Library与Architecture Components中的生命周期集成。如果您不使用Lifecycle库,则不需要从26.0.2进行更新。有关更多信息,请参阅Architecture Components发行说明。

重要变化

  • FragmentFragmentActivity(作为AppCompatActivity的基类)现在实现了Architecture Components的LifecycleOwner接口。

相比之下,Android P中的FragmentActivity没有实现接口LifecycleOwner

Google+发布的帖子中(在ThanosFisherman的答案中提到),Ian发表了评论:

你不能在发布后更改框架代码-它实际上被冻结在时间上。这意味着没有新功能,更重要的是没有错误修复。对于开发人员来说,这不是一个好的开发体验,尤其是当我们有一个完全支持、最新、向后兼容的版本的Support Library时。

我认为这就是Android P不采用Lifecycle的原因。因此,在Android P中,Fragment已被弃用。


14

如果有人正在寻找通过类名实例化片段的方法。

旧方式:

Fragment.instantiate(context, fragmentClass)

新方式:

val fm: FragmentManager = ...
fm.fragmentFactory.instantiate(ClassLoader.getSystemClassLoader(), fragmentClass)

使用扩展功能:


文件名: FragmentManagerExt.kt

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager

fun FragmentManager.instantiate(className: String): Fragment {
    return fragmentFactory.instantiate(ClassLoader.getSystemClassLoader(), className)
}

使用示例:

val fragment = supportFragmentManager.instantiate(fragmentClassName)

感谢你提供的 supportFragmentManager 解决方案,兄弟。 - Navinpd

11

支持库 Fragment 已经逐渐成为主流。Google 鼓励您使用支持库版本,以获得在所有 API 级别上一致的行为、修复后移植的错误,并提供生命周期和 ViewModel 的支持。

旧参考链接(已失效)

新参考链接


谷歌+已关闭,那么你在哪里可以找到关于它的信息? - OscarLeif
1
@OscarLeif 请查看 https://medium.com/androiddevelopers/loaders-in-support-library-27-1-0-b1a1f0fee638 - Vadim Kotov

1
在Android x中,应该使用supportFragmentManager而不是fragmentManager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接