安卓支持库27,片段更新?

21

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

26.1.0中,我可以在我的Fragmentandroid.support.v4.app)中使用getContext()(与Kotlin的context一起使用),并且没有空指针问题,但是由于我使用Kotlin,在版本27.0.0中出现了问题,所有的context调用都不能正常工作,我需要一个安全操作符,如context!!,但由于我个人认为每次都这么做很麻烦,所以我只是自己创建了一个解决方法。

override fun getContext() = super.getContext()!!
另一件事情突然发生了变化(这也是我询问的原因),就是方法onCreateView()onViewCreated()。在onCreateView中,填充器不可能为空,所以我需要更改我的函数签名才能正确地从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方法甚至是final的,所以我不能在那里使用我的解决方法,这使它非常丑陋。实际上,在源文件中,这些方法看起来是相同的,但是26.1.0具有Kotlin返回类型Context!,而27.0.0具有返回类型Context?


略有关联...非空的Inflater意味着没有UI但用作工作者的Fragment现在不是一种选择了吗? - cutiko
@cutiko 我不知道你的意思。 - creativecreatorormaybenot
1个回答

38
这些都是有意为之的更改。在这个版本的支持库之前,这些类没有空值注释,所以从 Kotlin 中,所有这些类型都只是平台类型。在27中,他们添加了必要的注释,所以现在这些类型在 Kotlin 中肯定标记为可空或非空 - 不需要猜测它们是否可以为 null
至于您提到的特定方法: - 当 Fragment 没有被附加到 Activity 时,getActivitygetContext 方法返回可空类型,因为这些方法已经返回 null。行为没有变化,只是现在明确标记,所以您可以安全地处理它。 - onCreateView 方法中的 inflater 参数曾经是平台类型,所以您可以自行决定它是否可空。由于它永远不会被调用为 null,因此已经明确注释为 @NonNull,因此它在 Kotlin 中的类型现在严格为 LayoutInflater,而不是“松散”的 LayoutInflater! 类型。
编辑:从 Support Library 27.1.0 开始,您可以使用返回非空类型的 requireActivityrequireContext 方法,但请注意,当常规方法返回 null 时,它们将抛出 IllegalStateException

9
谢谢您的回答。对于 Kotlin 来说,这非常讨厌,因为在我的情况下 getContext()getActivity() 永远不会为空。这意味着我现在需要在每次调用它们后加上 !! 断言,这非常令人恼火。 - creativecreatorormaybenot
请注意,如果可以在活动/片段为空的情况下调用该方法,则您可能希望以不同于使用空断言“!!”的方式进行处理。另一种方法是使用例如activity?.let { /* Do something*/ } - Fhl
6
从27.1.0版本开始,你可以使用requireContext()和requireActivity()方法。 - android_dev
@Fhl,你可以使用(context ?: return)代替context!!context?.let{} - vovahost
2
提示:在某些情况下,Android Studio的“智能提示”(Alt + Enter)会提供将代码包装在context?.let { ... }activity?.let { ... }调用中的选项,这对于快速重构非常有用。 - Erik

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