gpt4 book ai didi

android - Kotlin Android Button.onClickListener 导致 NoSuchMethodError

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:43 26 4
gpt4 key购买 nike

我想我发现了使用 kotlin for android 的怪癖,或者我对语法的理解存在一些差距。

尝试为按钮设置 onClickListener 会引发 NoSuchMethodError

这是错误的代码

button.setOnClickListener(Button.OnClickListener {
fun onClick(view: View){
val intent : Intent = Intent(this,DetailActivity::class.java)
if(obj is String) {
intent.putExtra("Topic", obj)
}
startActivity(intent)
}
})

这是输出的堆栈跟踪

 java.lang.NoSuchMethodError: No static method OnClickListener(Lkotlin/jvm/functions/Function1;)Landroid/view/View$OnClickListener; in class Landroid/widget/Button; or its super classes (declaration of 'android.widget.Button' appears in /system/framework/framework.jar:classes2.dex)

有人知道怎么回事吗?

最佳答案

有趣的是,我没有得到那个错误,你的代码为我编译。但是,由于不同的原因,它不会起作用:您在 {} 中将 lambda 作为监听器传递,这意味着它的内容将在点击事件发生时执行。虽然没有代码可以在其中运行,您只是定义了一个 local function名为 onClick,永远不会被调用。

button.setOnClickListener(Button.OnClickListener {
fun onClick(view: View){
...
}

Log.d("TAG", "hi") // this is the code that would be executed on click events
})

有两种方法可以修复语法:

首先,您可以使用 object expression创建监听器,这与您编写的内容非常接近,并且与经典 Java 解决方案保持一致,它显式创建了一个匿名类(请注意 OnClickListener 接口(interface)实际上位于 查看类):

button.setOnClickListener(object: View.OnClickListener {
override fun onClick(v: View?) {
val intent = ...
}
})

或者您可以使用更短、更像 Kotlin 的语法,无论如何,当您尝试使用以前的长格式时,IDE 会建议,方法是使用 SAM conversion :

button.setOnClickListener {
val intent = ...
}

此解决方案使用 lambda 就像您的初始代码所做的那样,它只是没有显式命名它转换到的接口(interface),并删除了不需要单个 lambda 参数的 ()

关于android - Kotlin Android Button.onClickListener 导致 NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44336724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com