Android支持库27,片段更新?

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

由于我将我的项目更新为SDK版本27,并将支持库的gradle插件更新为版本
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()
。这意味着我现在需要断言
,这非常烦人。请注意,如果可以在activity/fragment为null的情况下调用该方法,您可能希望以与使用null断言不同的方式来处理它
。另一种方法是使用例如
activity?。让{/*做点什么*/}
从27.1.0开始,您可以使用requireContext()和requireResponsibility()methods@Fhl而不是使用
上下文
context?.let{}
您可以使用
(context?:return)
。提示:在某些情况下,Android Studio的“直觉”(Alt+Enter)提供了一个
context?的包装。let{…}
活动?.let{…}
调用可以方便地进行快速重构。