虽然已经回答了这个问题,但我想扩展现有的答案。
正如 TheWanderer 已经提到的,这里的花括号表示 lambda 的主体。 Kotlin 支持将回调放在 常规括号之外。
这个:
button.setOnClickListener {clickListener()}
等于:
button.setOnClickListener({clickListener()})
等于:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickListener();
}
});
或者(仅限 Java 8):
button.setOnClickListener(view -> clickListener());
TL;DR: 函数参数的内容用() 定义,lambda 主体用{} 定义(就像普通函数、类、接口等一样)。
现在,首先,onClick 方法回调接受view 参数。如果你使用一个独立的函数,它需要有这个参数:
fun clickListener(view: View) { TODO("Place your listener code here") }
这是基于命名的——如果你正在实现OnClickListener,只需将this 作为参数传递。你已经有了监听器和函数,所以你不需要显式定义一个来传递。但是,如果您确实实现了OnClickListener,如果您有多个视图将其用作侦听器,请确保在采取行动之前检查 ID。
如果是使用方法,接下来就看怎么用了。
使用var 或val 函数
如果你的回调定义为:
val listener = {view: View ->
TODO()
}
你可以像参数一样传递它:
button.setOnClickListener(listener)
OnClickListeners
如果您有var onClickListener: OnClickListener,则与var/val 函数相同。
使用函数
如果您有 fun clickListener,则必须添加 lambda 才能传递它。这就像使用 Java 一样,使用 ::。但是,您不需要像在 Java 中那样显式声明范围。这意味着其中任何一个都可以工作:
button.setOnClickListener(::clickListener);
button.setOnClickListener(this::clickListener);
// alternatively with a different target, if it's somewhere else.
进一步阅读