尽管这个问题已经得到了回答,但我想扩展现有的答案。
正如 TheWanderer 已经提到的,这里的花括号表示 lambda 的主体。 Kotlin 支持放置回调outside常规括号。
This:
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。
如果您正在使用方法,那么接下来就取决于如何使用。
Using var
or val
功能
如果您的回调定义为:
val listener = {view: View ->
TODO()
}
您可以像传递参数一样传递它:
button.setOnClickListener(listener)
单击监听器
如果你有一个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.
进一步阅读
- 初始化函数类型 - Kotlin 文档 https://kotlinlang.org/docs/reference/lambdas.html#instantiating-a-function-type