Android P 中不推荐使用的片段

Posted

技术标签:

【中文标题】Android P 中不推荐使用的片段【英文标题】:Fragments deprecated in Android P 【发布时间】:2018-09-01 22:31:44 【问题描述】:

我在查看documentation 并找到了这个

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

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

【问题讨论】:

投反对票/考虑投反对票的人,能否请您也给出一个正当理由?我认为这是一个真实的问题,可以为我们所有人提供一些有见地的答案。 只有当你问做某事的人时,做某事的原因才有意义。在这种情况下,您必须询问 Google。 现在只有支持实现在运行,在 2018 年使用 Fragments 是否仍然有意义?改用什么? @RoyalGriffin,反对者是仇恨者。他们无法解释他们的行为,他们只是看到 SO 的规则(这是不合逻辑的),然后用减号标记并要求版主关闭或删除问题(有时是正确答案)。 @TheincredibleJan Google 代表正在阅读关于 SO 的 Android 相关问题并与之互动,因此它是正确的论坛。 【参考方案1】:

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

老办法:

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)

【讨论】:

感谢兄弟支持FragmentManager解决方案..【参考方案2】:

Android x 中使用 supportFragmentManager 代替 fragmentManager

【讨论】:

【参考方案3】:

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

Old Reference Link(Dead)

New Reference Link

【讨论】:

Google+ 已关闭,您在哪里可以找到相关信息? @OscarLeif 见medium.com/androiddevelopers/…【参考方案4】:

支持库 27.1.0 中的重写

Ian's medium post(2018 年 2 月 28 日)对此进行了解释。他是 Google 的 Android 框架开发人员。

支持库 27.1.0 中的加载器

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

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

27.1.0 中的变化 在 27.1.0 之后,Loaders 的技术债务大大减少了:……

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

似乎FragmentFragmentActivity 中的代码已被重构,以使加载程序成为可选依赖项。

根据the release note,新的实现是基于Lifecycle

重要变化Loaders 的底层实现已被重写为使用 Lifecycle。

架构组件

在Support Library 26.1.0、FragmentFragmentActivity 中采用了Lifecycle

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

重要变化

Fragment 和 FragmentActivity(AppCompatActivity 的基类)现在从架构组件实现 LifecycleOwner 接口。

相比之下,Android P 中的Fragment 和Activity 并没有实现接口LifecycleOwner

在the Google+ post(ThanosFisherman’s answer中提到),Ian发表了评论:

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

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

【讨论】:

以上是关于Android P 中不推荐使用的片段的主要内容,如果未能解决你的问题,请参考以下文章

可扩展列表视图在 android 的片段活动中不起作用

片段隐藏在Android中不起作用

片段中的按钮在android中不起作用

如何修复空白片段?

Cordova 4.0 上的 Android 片段内的 Cordova webview

底部的android寻呼机标签条带走整个片段