我是Android新手。
这是代码:

Switch.setOnCheckedChangeListener { _, isChecked ->
// do something}
我已经用C++完成了一些编码,所以我知道我必须像这样调用它
variable = OnCheckedChangeListener
Switch.setOnCheckedChangeListener**(variable)** { _, isChecked ->
        // do something}
我不知道为什么没有我传递任何参数的情况下该函数为何起作用。
非常感谢你。

最佳答案

如果我们查看Switch View 的源代码,则setOnCheckedChangeListener()方法的定义如下:

fun setOnCheckedChangeListener(listener: CompoundButton.OnCheckedChangeListener?) {
    mOnCheckedChangeListener = listener
}
它确实需要一个以OnCheckedChangeListener接口(interface)形式的参数,其定义如下所示:
interface OnCheckedChangeListener {
    fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean)
}
它只有一种方法。只有一种抽象方法的接口(interface)称为功能接口(interface),或单一抽象方法(SAM)接口(interface)。
对于功能性接口(interface),您可以使用SAM转换,这些转换通过使用lambda表达式来使您的代码更简明易读。
可以使用lambda表达式来代替创建手动实现功能接口(interface)的类。通过SAM转换,Kotlin可以将其签名与接口(interface)的单个​​方法的签名匹配的任何lambda表达式转换为实现该接口(interface)的类的实例。
因此,您不必传递OnCheckedChangeListener实例的原因是由于语法糖,Kotlin允许您仅定义接口(interface)描述的方法的主体,它将创建并传递参数到后面现场。
如果您想自己做,它看起来像这样:
switch.setOnCheckedChangeListener(object : OnCheckedChangeListener {
    override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
        // do something
    }
})
  • Official documentation
  • 10-07 19:47
    查看更多