Android支持库27,片段更新?

时间:2017-11-12 15:54:11

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

自从我将项目更新为SDK版本27并将支持库的gradle插件更新为版本27.0.0后,我需要更改我的代码。

使用26.1.0我可以在getContext()context)中使用Fragment(与Kotlin android.support.v4.app),我没有可空性问题,但是我使用Kotlin我的版本27.0.0有问题,我的所有context调用都不再有效,我需要一个安全运算符,如context!!,但因为我个人觉得它是一个每次我做自己的工作时都要努力做到这一点

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

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

所以现在我想知道为什么,特别是(对于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返回类型Context?

1 个答案:

答案 0 :(得分:36)

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

至于你提到的具体方法:

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

编辑:从支持库27.1.0开始,您可以使用返回非可空类型的platform typesrequireActivity方法,并注意它们会抛出{{1}当常规方法返回IllegalStateException时。