android - 为什么开发人员不直接将参数传递给 setOnCheckedChangeListener

标签 android kotlin

我是安卓新手。
这是代码:

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
    }
})
  • Official documentation
  • 关于android - 为什么开发人员不直接将参数传递给 setOnCheckedChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64396966/

    相关文章:

    android - CodenameOne 的 iOS 构建失败

    c# - 如何从 Android MainActivity.cs 文件更改 Xamarin.forms 中页面标签的文本?

    java - Hibernate 注释扫描在 Gradle 5.4 下不起作用

    android - Rxjava 返回 LiveData 列表

    kotlin - 覆盖运算符Int RangeTo不起作用

    java - 如何通过数据绑定(bind)更新布局元素的可见性

    android - 当我运行项目时发生这种错误

    android - asmack如何知道消息发送失败

    generics - Kotlin类型参数的子类

    android - 刀柄找不到服务