启用/禁用Kotlin片段中的按钮

gg0vcinb  于 2022-12-23  发布在  Kotlin
关注(0)|答案(3)|浏览(183)

我尝试添加一个函数来启用/禁用片段中的一些按钮,但是出现编译错误
“在可为空的接收方上只允许安全(?.)或非空Assert(!!.)调用”
我试过几种不同的方法;从直接调用按钮到调用执行按钮操作的Activity,但我得到了相同的错误:

private fun enableButtons(buttonState: Boolean) {
    (activity as MainActivity?).enableButtons(buttonState)
    //                         ^ error there
}

以及

var button = activity.findViewById(R.id.button0) as Button
    //                   ^ error here
    button.isEnabled = false
    button.isClickable = false

我刚接触Kotlin,不知道如何在不传递视图的情况下访问按钮

cgvd09ve

cgvd09ve1#

好吧,这是在暗示你该怎么做:
"在可为空的接收方上只允许安全(?.)或非空Assert(!!.)调用"
意味着无论你使用什么变量,都可能是空的。所以如果你试着运行

(activity as MainActivity?).enableButtons(buttonState)

这可能最终为:

null.enableButtons(buttonState)

这(您可能已经知道)将导致崩溃
kotlin所要求的只是一个替代方案(当变量实际上是null时)或一个变量不为空的"承诺"(!!)
一个简单的解决方法就是使用:

(activity as MainActivity?)!!.enableButtons(buttonState)

或者只删除MainActivity之后的?
(more在.?!!上,您可以在此处找到:What's the difference between !! and ? in Kotlin?

jexiocij

jexiocij2#

如果不确定activity是否可以为空,则应使用以下语法:

(activity as MainActivity?)?.enableButtons(buttonState)

其他人建议强制展开,但这意味着如果activity最终为空,您的应用程序崩溃。
这适用于任何可选值:

var button = activity?.findViewById<Button>(R.id.button0)

现在,如果您想再次使用该按钮,您可以简单地使用null安全语法:

button?.setOnClickListener { 
    // do stuff           
}

有关null safety的更多信息,请查看:https://kotlinlang.org/docs/null-safety.html#checking-for-null-in-conditions

hgb9j2n6

hgb9j2n63#

溶液1

MainActivity前面卸下?

(activity as MainActivity).enableButtons(buttonState)

溶液2

(activity as MainActivity?)之前添加?

(activity as MainActivity?)?.enableButtons(buttonState)

注:MainActivity得到null的情况很少。因此,最佳解决方案是上面的第一个。

相关问题