我想我已经找到了使用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中传入一个lambda作为{}内的监听器,这意味着当click事件发生时它将被执行.虽然没有代码在其中运行,但您只是定义了一个名为onClick的
local function永远不会被调用.
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接口实际上位于View类之下):
button.setonClickListener(object: View.OnClickListener { override fun onClick(v: View?) { val intent = ... } })
或者,您可以使用更简单,更像Kotlin的语法,当您尝试使用之前的长格式时,IDE会建议使用SAM conversion:
button.setonClickListener { val intent = ... }
这个解决方案使用lambda就像你的初始代码一样,它只是没有命名它明确转换为什么接口,并且删除了不需要单个lambda参数的().
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。