fun newInstance(message: String?): DialogFragment {
return DialogFragment().apply {
arguments = Bundle().apply {
putString("arg", message)
}
}
}
该消息指出this
内部的apply()
引用指向自API 21以来可用的BaseBundle
类,它将在较低的API上崩溃。 Bundle#putString(key, value)绝对可以在较低版本上使用,但Android Studio 3.0-alpha8中存在错误。
哪个引用Bundle
类型不是BaseBundle
。
为什么我们首先出现Lint错误?
答案 0 :(得分:3)
它真的看起来像一个错误它是一个known bug,但是如果查看Bundle.java源代码,实际上可以看到为什么你会收到警告。
在api 21之前Bundle
有一个方法(check here)
public void putString(@Nullable String key, @Nullable String value)
并且班级本身没有超级班级。从api 21 Bundle
扩展了新添加的BaseBundle
类,此方法putString
已moved到BaseBundle
。因此,当您在api 21及更高版本上调用该方法时,该方法属于BaseBundle
,对于较低版本,它属于Bundle
。
这与apply
块有某种关联,因为如果直接在Bundle
- 类型变量上调用该方法,则不会出现警告。
答案 1 :(得分:1)
一种解决方法是使用let
代替apply
,例如:
fun newInstance(message: String?): DialogFragment {
return DialogFragment().apply {
arguments = Bundle().let {
it.putString("arg", message)
it
}
}
}