58

我正在查看文档并找到了这个

此类在 API 级别 P 中已弃用。

为什么在android P中不推荐使用片段?

4

4 回答 4

29

支持库 27.1.0 中的重写

Ian 的中型帖子(2018 年 2 月 28 日)给了我们一个解释。他是 Google 的 Android 框架开发人员。

支持库 27.1.0 中的加载程序

对于 Support Library 27.1.0,我重写了 LoaderManager 的内部结构,该类为 Loaders API 提供支持,我想解释更改背后的原因以及未来的预期。

Loaders 和 Fragments,一段历史
从一开始,Loaders 和 Fragments 就紧紧地绑在了一起。这意味着 FragmentActivity 和 Fragment 中的很多代码都是为了支持 Loaders,尽管事实上它们确实是相当独立的。…</p>

27.1.0 的变化 在 27.1.0
中,Loaders 的技术债务已经大大减少:……

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

似乎其中的代码已被重构FragmentFragmentActivity以使 Loaders 成为可选依赖项。

根据发布说明,新的实现基于Lifecycle.

重要更改Loaders
的底层实现  已被重写为使用 Lifecycle

架构组件

支持库 26.1.0中,Fragment 并 FragmentActivity已采用Lifecycle.

这是一个将支持库与架构组件的生命周期集成的特殊版本。如果您不使用 Lifecycles 库,则无需从 26.0.2 更新。有关详细信息,请参阅架构组件发行说明。

重要变化

  • Fragment 和 FragmentActivity(AppCompatActivity 的基类)现在从 Architecture Components 实现 LifecycleOwner 接口。

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

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

你不能在框架代码发布后更改它——它实际上是及时冻结的。这意味着没有新功能,更重要的是没有错误修复。这不是一个好的开发者体验,特别是当我们在支持库中有一个完全支持的、最新的、向后兼容的版本时。

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

于 2018-04-27T06:54:12.060 回答
11

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

老办法:

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)
于 2019-09-17T05:43:43.717 回答
9

支持库片段将继续存在。Google 鼓励您使用支持库版本在所有 API 级别、向后移植的错误修复以及生命周期和 ViewModel 支持中获得一致的行为。

旧参考链接(死)

新的参考链接

于 2018-03-23T09:44:05.550 回答
0

Android x中使用supportFragmentManager 代替 fragmentManager

于 2019-10-03T09:40:32.000 回答