Kotlin Android Button.onClickListener导致NoSuchMethodError
我想我已经发现了在android上使用kotlin的一个怪癖,或者在我对语法的理解上存在一些差距 尝试为按钮设置Kotlin Android Button.onClickListener导致NoSuchMethodError,android,exception,kotlin,Android,Exception,Kotlin,我想我已经发现了在android上使用kotlin的一个怪癖,或者在我对语法的理解上存在一些差距 尝试为按钮设置onClickListener会抛出NoSuchMethodError 这是错误代码 button.setOnClickListener(Button.OnClickListener { fun onClick(view: View){ val intent : Intent = Intent(this,DetailActivit
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)
}
})
这是输出的stacktrace
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)
有人知道怎么回事吗?试试看
button.setOnClickListener {
// Handler code here
}
有趣的是,我不明白这个错误,你的代码为我编译。但是,由于另一个原因,它不起作用:您在
{}
中传递一个lambda作为侦听器,这意味着它的内容将在click事件发生时执行。不过,它里面没有可运行的代码,您只是定义了一个永远不会被调用的命名的onClick
button.setOnClickListener(Button.OnClickListener {
fun onClick(view: View){
...
}
Log.d("TAG", "hi") // this is the code that would be executed on click events
})
有两种方法可以修复语法:
首先,您可以使用创建监听器,这与您编写的非常接近,并且与经典Java解决方案类似,它显式地创建了一个匿名类(请注意,OnClickListener
接口实际上位于视图
类下):
或者您也可以使用更短、更像Kotlin的语法,当您尝试使用前面的长格式时,IDE会建议您使用该语法,方法是:
此解决方案与初始代码一样使用lambda,它只是不显式命名转换为的接口,并删除不需要单个lambda参数的()
。您可以尝试:
// case 1
button?.setOnClickListener { view ->
// handler here
}
// case 2
button?.setOnClickListener {
// you can use keyword 'it' for use member view
// handler here
}
button.setOnClickListener {
val intent = ...
}
// case 1
button?.setOnClickListener { view ->
// handler here
}
// case 2
button?.setOnClickListener {
// you can use keyword 'it' for use member view
// handler here
}