使用方法参考的 Kotlin setOnClickListener 不起作用
Kotlin setOnClickListener using method reference not working
我尝试使用与 Java 中相同的方法引用:
button.setOnClickListener(this::clickListener);
使用科特林:
button.setOnClickListener {this::clickListener}
但这在 Kotlin 中不起作用,解决方案是使用 labmda 表达式实际调用函数:
button.setOnClickListener {clickListener()}
为什么 Kotlin 在这种情况下不接受方法引用?和Java的原理不一样吗?
大括号表示lambda表达式的内容。 Kotlin 已经在幕后传递了一个 OnClickListener 实例,并为您提供 onClick()
方法。
如果要传递已分配给变量的侦听器,请使用括号:
button.setOnClickListener(clickListener)
如果要使用函数,同Java:
button.setOnClickListener(this::clickListener)
fun clickListener(v: View) {}
你可以在科特林中做到这一点。用圆括号替换大括号。
btn.setOnClickListener (this::clicklistener)
fun clicklistener(v: View){}
虽然这已经得到回答,但我想扩展现有的答案。
正如 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.
进一步阅读
我尝试使用与 Java 中相同的方法引用:
button.setOnClickListener(this::clickListener);
使用科特林:
button.setOnClickListener {this::clickListener}
但这在 Kotlin 中不起作用,解决方案是使用 labmda 表达式实际调用函数:
button.setOnClickListener {clickListener()}
为什么 Kotlin 在这种情况下不接受方法引用?和Java的原理不一样吗?
大括号表示lambda表达式的内容。 Kotlin 已经在幕后传递了一个 OnClickListener 实例,并为您提供 onClick()
方法。
如果要传递已分配给变量的侦听器,请使用括号:
button.setOnClickListener(clickListener)
如果要使用函数,同Java:
button.setOnClickListener(this::clickListener)
fun clickListener(v: View) {}
你可以在科特林中做到这一点。用圆括号替换大括号。
btn.setOnClickListener (this::clicklistener)
fun clicklistener(v: View){}
虽然这已经得到回答,但我想扩展现有的答案。
正如 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.