Android 无法在带有Kotlin的方法调用中为接口传递lambda(就像setOnClickListener那样)
我创建了这个类:Android 无法在带有Kotlin的方法调用中为接口传递lambda(就像setOnClickListener那样),android,kotlin,lambda,Android,Kotlin,Lambda,我创建了这个类: class SomeClass { var listener: SomeListener? = null interface SomeListener { fun onClick(v: View?) } fun addSomeListener(l: SomeListener){ listener = l } } 我这样称呼它,效果很好: SomeClass().addSomeListener(obj
class SomeClass {
var listener: SomeListener? = null
interface SomeListener {
fun onClick(v: View?)
}
fun addSomeListener(l: SomeListener){
listener = l
}
}
我这样称呼它,效果很好:
SomeClass().addSomeListener(object : SomeClass.SomeListener {
override fun onClick(v: View?) {
// Do something
}
})
但是,以下语法在Android Studio中失败::
SomeClass().addSomeListener{ view ->
// Do something
}
类型不匹配。必需:找到SomeClass.SomeListener:
() → 单位
我不明白这一点,因为Android的
setOnClickListener
方法是以同样的方式实现的:
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable.
*
* @param l The callback that will run
*
* @see #setClickable(boolean)
*/
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
而且
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
这显然可以称为:
someView.setOnClickListener { view ->
// Do something
}
我缺少什么?它正在调用
SAM转换。如果你想让它工作,你需要为你的界面添加关键字fun
,所以它看起来像这样:
fun interface SomeListener {
fun onClick(v: View?)
}
通过阅读本文,您可以了解更多信息。功能(SAM)接口:您不知道Java接口与Kotlin接口的处理方式不同。