我是安卓新手。
这是代码:
Switch.setOnCheckedChangeListener { _, isChecked ->
// do something}
我已经在 C++ 中完成了一些编码,所以我知道我必须像这样调用它variable = OnCheckedChangeListener
Switch.setOnCheckedChangeListener**(variable)** { _, isChecked ->
// do something}
我不知道为什么这个函数没有我传入任何参数就可以工作。非常感谢你。
最佳答案
如果我们查看 Switch
的源代码看,setOnCheckedChangeListener()
方法定义如下:
fun setOnCheckedChangeListener(listener: CompoundButton.OnCheckedChangeListener?) {
mOnCheckedChangeListener = listener
}
它确实需要一个参数,形式为接口(interface) OnCheckedChangeListener
,其定义如下所示: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
}
})
关于android - 为什么开发人员不直接将参数传递给 setOnCheckedChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64396966/