Android 支持库 27、Fragment 更新?

标签 android android-fragments kotlin android-support-library android-8.0-oreo

由于我将项目更新到 SDK 版本 27 并将支持库的 gradle 插件更新到版本 27.0.0 我需要更改我的代码。

使用 26.1.0 我可以在我的 Fragment 中使用 getContext() (使用 Kotlin context) (android.support.v4.app) 并且我没有可空性问题,但由于我使用 Kotlin,我的版本 27.0.0 有问题,我的所有 context 调用不再起作用了,我需要一个安全操作符,比如 context!!,但是因为我个人觉得每次我自己做的时候都需要很忙,所以我变通了功能

override fun getContext() = super.getContext()!!

另一件改变(突然,这就是我要问的原因)是方法 onCreateView()onViewCreated()。在 onCreateView 中,inflater 不再可能为空,因此我需要更改我的函数签名以正确覆盖从 onCreateView(inflater: LayoutInflater?...) onCreateView(inflater: LayoutInflater...)onViewCreated 中的 createdView 参数相同。

所以现在我想知道为什么,尤其是(对于 Kotlin)非常丑陋的 getContext() 更改并转到 https://developer.android.com/sdk/support_api_diff/27.0.0/changes.html .

但是等等,显然他们没有改变它?所以现在我的问题是我做错了什么,或者他们是否真的改变了它,如果是这样,我可能会问他们为什么?

顺便说一句,同样适用于 getActivity(),我认为添加了 mHost == null 检查并且 getActivity 方法是即使是最终的,所以我不能在那里使用我的解决方法,这使得它非常难看。实际上在源文件中的方法看起来是一样的,但是 26.1.0 有 Kotlin 返回类型 Context!27.0.0 返回类型 上下文?.

最佳答案

这些都是故意的改变。在此版本的支持库之前,这些类没有可空性注释,因此从 Kotlin 中,所有这些类型都只是 platform types .在 27 中,他们添加了必要的注解,所以现在这些类型在 Kotlin 中明确标记为可空或不可空 - 无需猜测它们是否可以为 null

至于你提到的具体方法:

  • getActivitygetContext 方法返回可空类型,因为当 Fragment 未附加到 Activity 时,这些方法已经返回 null。行为没有变化,只是现在明确标记,因此您可以安全地处理它。
  • onCreateView 方法的inflater 参数曾经是一种平台类型,因此是否将其标记为可空取决于您。由于它永远不会被 null 调用,它被显式注释为 @NonNull,所以它在 Kotlin 中的类型现在严格地是 LayoutInflater 而不是“更宽松”的 LayoutInflater! 类型。

编辑:从支持库 27.1.0 开始,您可以使用 requireActivityrequireContext方法,它们返回不可为空的类型,但需要注意的是,当常规方法返回 null 时,它们会抛出 IllegalStateException

关于Android 支持库 27、Fragment 更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47250787/

相关文章:

java - android onServiceConnected() 是在单独的线程中调用的吗?

java - 如何在 Android Studio 项目中包含 .jar 库

java - 使用 Google Admob 自动滚动 fragment 和 Activity ?

android - 此字段泄漏上下文对象

kotlin - TeamCity Kotlin DSL 中元运行器的替代品是什么?

intellij-idea - 暂存文件未在 IntelliJ IDEA 上运行

Android Studio 3.0 子模块编译失败

java - 安卓测试 : What do to when nothing has an id?

android - 确定 Espresso 测试时的 fragment 变化

android - 冲突的 Android 错误消息 : The specified child already has a parent. 您必须先对 child 的 parent 调用 removeView()