Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Android Button.onClickListener导致NoSuchMethodError_Android_Exception_Kotlin - Fatal编程技术网

Kotlin Android Button.onClickListener导致NoSuchMethodError

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

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

尝试为按钮设置
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
}