我刚开始学习科特林不久。
关于Android监听器中lambda表达式的传递,有些部分我不理解。
在JAVA中
botton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
我理解这个代码。
我理解这个代码。创建一个匿名对象并将其作为setOnClickListener
的参数传递。
在Kotlin
button.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
TODO("Not yet implemented")
}
})
我也理解这个代码。我理解它,因为它是一种创建类似Java的匿名对象的方法。
但是
在Kotlin的Lamda
button?.setOnClickListener { }
我不明白这个代码是如何工作的。
此处表达的lambda应作为setOnClickListener
的参数传递。
onClick()
是OnClickListener
接口的实现函数,怎么可能传递给setOnClickListener
?
我不太明白。
setOnClickListener
不是应该传递的OnClickListener
接口object
吗?
setOnClickListener
!
您可以通过尝试button?.setOnClickListener({ })
并注意到它仍在编译来测试这一点。
安卓工作室随后建议将其更改为button?.setOnClickListener(){ }
,正如Kotlin的编码惯例所规定的那样:
如果一个调用使用一个lambda,请尽可能将其传递到括号之外。
这给了我们button?.setOnClickListener(){ }
。
()
被标记为冗余从lambda函数调用中删除不必要的括号";导致…button?.setOnClickListener { }
!
注意:您可以ctrl/cmd单击函数名称,签名显示public void setOnClickListener(@Nullable OnClickListener l)