Cro*_*ile 2 lambda android kotlin
我创建了这个类:
class SomeClass {
var listener: SomeListener? = null
interface SomeListener {
fun onClick(v: View?)
}
fun addSomeListener(l: SomeListener){
listener = l
}
}
Run Code Online (Sandbox Code Playgroud)
我按如下方式调用它,效果很好:
SomeClass().addSomeListener(object : SomeClass.SomeListener {
override fun onClick(v: View?) {
// Do something
}
})
Run Code Online (Sandbox Code Playgroud)
但是,以下语法在 Android Studio 中失败:
SomeClass().addSomeListener{ view ->
// Do something
}
Run Code Online (Sandbox Code Playgroud)
类型不匹配。必需: 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;
}
Run Code Online (Sandbox Code Playgroud)
和...
/**
* 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);
}
Run Code Online (Sandbox Code Playgroud)
这显然可以称为:
someView.setOnClickListener { view ->
// Do something
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
它在叫SAM Conversions
。如果你想让它工作,你需要fun
为你的界面添加关键字,所以它看起来像这样:
fun interface SomeListener {
fun onClick(v: View?)
}
Run Code Online (Sandbox Code Playgroud)
您可以通过阅读这个已接受的答案来了解更多信息。
归档时间: |
|
查看次数: |
77 次 |
最近记录: |