Android支持库27,片段更新?
由于我将我的项目更新为SDK版本27,并将支持库的gradle插件更新为版本Android支持库27,片段更新?,android,android-fragments,kotlin,android-support-library,android-8.0-oreo,Android,Android Fragments,Kotlin,Android Support Library,Android 8.0 Oreo,由于我将我的项目更新为SDK版本27,并将支持库的gradle插件更新为版本27.0.0,因此我需要更改代码 使用26.1.0我可以在我的Fragment(android.support.v4.app)中使用getContext(),并且我没有可空性问题,但是因为我使用了Kotlin,我的27.0.0版本有问题,我所有的上下文调用都不再有效,我需要一个安全操作员,比如context,但因为我个人觉得每次我自己做这个时都很匆忙,所以我就绕开了这个函数 override fun getContext
27.0.0
,因此我需要更改代码
使用26.1.0
我可以在我的Fragment
(android.support.v4.app
)中使用getContext()
,并且我没有可空性问题,但是因为我使用了Kotlin,我的27.0.0
版本有问题,我所有的上下文
调用都不再有效,我需要一个安全操作员,比如context代码>,但因为我个人觉得每次我自己做这个时都很匆忙,所以我就绕开了这个函数
override fun getContext() = super.getContext()!!
另一个变化(突然,这就是为什么我要问)是方法onCreateView()
和onViewCreated()
。在onCreateView
中,充气机不可能再为空,因此我需要更改我的函数签名,以正确覆盖onCreateView(充气机:LayoutFlater?…)
到onCreateView(充气机:LayoutFlater…
中的CreateView
参数
所以现在我想知道为什么,特别是(对于Kotlin)非常难看的getContext()
更改被修改并转到了
但是等等,显然他们没有改变它?所以现在我的问题是,如果我做错了什么,或者他们真的改变了它,如果是这样,我可能会问他们为什么
顺便说一句,这同样适用于getActivity()
,我认为添加了mHost==null
检查,并且getActivity
方法甚至是最终方法,因此我无法在那里使用我的变通方法,这使得它非常难看。实际上,在源文件中,方法看起来是一样的,但是26.1.0
具有Kotlin返回类型上下文
和27.0.0
返回类型上下文?
这些都是故意更改的。在这个版本的支持库之前,这些类没有可空性注释,所以从Kotlin来看,所有这些类型都只是。在27中,他们添加了必要的注释,因此现在这些类型在Kotlin中被明确标记为可为null或不可为null-不需要猜测它们是否可以为null
关于你提到的具体方法:
getActivity
和getContext
方法返回可为null的类型,因为当Fragment
未附加到Activity
时,这些方法已经返回了null
。行为没有变化,只是现在显式标记了,所以您可以安全地处理它
onCreateView
方法的inflater
参数过去是一种平台类型,因此是否将其标记为null取决于您。由于它永远不会用null
调用,它被显式注释为@NonNull
,因此它在Kotlin中的类型现在严格地说是LayoutInflater
,而不是“looser”LayoutInflater代码>类型
编辑:从support library 27.1.0开始,您可以使用and方法,它们返回不可为null的类型,但需要注意的是,当常规方法返回略微相关的null
时,它们将抛出IllegalStateException
。。。非空充气器意味着没有用户界面但被用作工人的fragmen现在不是替代品了?@cutiko我不知道你的意思。谢谢你的回答。这对于Kotlin来说非常难看,因为在我的例子中,getContext()
永远不会为null,也不会是getActivity()
。这意味着我现在需要断言每次调用都使用code>,这非常烦人。请注意,如果可以在activity/fragment为null的情况下调用该方法,您可能希望以与使用null断言不同的方式来处理它代码>。另一种方法是使用例如activity?。让{/*做点什么*/}
从27.1.0开始,您可以使用requireContext()和requireResponsibility()methods@Fhl而不是使用上下文
或context?.let{}
您可以使用(context?:return)
。提示:在某些情况下,Android Studio的“直觉”(Alt+Enter)提供了一个context?的包装。let{…}
或活动?.let{…}
调用可以方便地进行快速重构。