java - 使用方法引用的 Kotlin setOnClickListener 不起作用

标签 java android kotlin method-reference

我尝试像在 Java 中一样使用方法引用:

button.setOnClickListener(this::clickListener);

使用 Kotlin:

button.setOnClickListener {this::clickListener}

但这在 Kotlin 中不起作用,解决方案是使用 labmda 表达式实际调用函数:

button.setOnClickListener {clickListener()}

为什么 Kotlin 在这种情况下不接受方法引用?跟Java不也是一样的原理吗?

最佳答案

虽然这已经得到回答,但我想扩展现有的答案。

正如 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 主体是用 {} 定义的(就像 with常规函数、类、接口(interface)等)。

现在,首先,一个 onClick 方法回调接受一个 view 参数。如果你使用一个独立的函数,它需要有这个参数:

fun clickListener(view: View) { TODO("Place your listener code here") }

这基于命名——如果您要实现 OnClickListener,只需将 this 作为参数传递即可。您已经有了监听器和函数,因此您无需显式定义一个即可通过。但是,如果您确实实现了 OnClickListener,并且您有多个 View 将其用作监听器,请确保在采取行动之前检查 ID。

如果是用methods,接下来就看how了

使用varval 函数

如果您的回调定义为:

val listener = {view: View -> 
       TODO()               
    }

你可以像参数一样传递它:

button.setOnClickListener(listener)

OnClickListeners

如果您有一个 var onClickListener: OnClickListener,与 var/val 函数一样适用。

使用函数

如果您有一个有趣的 clickListener,则必须添加 lambda 来传递它。这与 Java 一样,使用 ::。但是,您不需要像在 Java 中那样显式声明作用域。这意味着其中任何一个都可以工作:

button.setOnClickListener(::clickListener);
button.setOnClickListener(this::clickListener);
// alternatively with a different target, if it's somewhere else. 

进一步阅读

关于java - 使用方法引用的 Kotlin setOnClickListener 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54237736/

相关文章:

java - 单击 Fragment 会在 Activity 中进行

java - 为二十一点创建人工智能

java - 线程池的责任链

java - 获取条目后出现 KeyStore EOFException

安卓;检测设备中的振动设置是打开还是关闭,尤其是当它响了但不振动的情况

android - 为什么 map 没有显示在移动设备上?

具有启动服务的 Android 进程重要性不是 IMPORTANCE_SERVICE

function - 如何使用 Kotlin 将函数输出转换为 Unit

kotlin - 如何定义我作为参数传递的函数作为可空值?

java - 使用java小程序将数据插入mysql表