Kotlin中setOnLongClickListener()报错:类型不匹配,求正确用法
解决Kotlin中setOnLongClickListener的Type mismatch错误
这个问题我之前也碰到过,其实原因很简单——Kotlin里的setOnLongClickListener和setOnClickListener对回调的返回值要求不一样!
问题根源
setOnClickListener的回调不需要返回值(返回Unit,对应Java中的void),但setOnLongClickListener的回调必须返回一个Boolean值,用来告诉系统:这个长按事件是否已经被你处理了。而你现在的代码里,Toast.makeText(...).show()返回的是Unit,自然就会出现「Type mismatch. Required:Boolean Found:Unit」的错误。
解决方法
只需要在你的lambda代码块最后,添加一个Boolean类型的返回值就行,有两种常用写法:
写法1:利用Kotlin lambda的隐式返回
Kotlin中lambda的最后一行表达式就是返回值,直接在Toast代码后加true或false即可:
view.setOnLongClickListener { Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show() true // 表示已处理该事件,系统不会再触发后续相关行为 }
写法2:显式指定返回(可读性更高)
如果你想让代码逻辑更清晰,可以用return@setOnLongClickListener显式声明返回值:
view.setOnLongClickListener { Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show() return@setOnLongClickListener true }
关于返回值的小说明
- 返回
true:告诉系统你已经处理了这个长按事件,系统不会再把事件传递给其他监听器,也不会触发该View的默认长按行为(比如文本选择)。 - 返回
false:表示你没有处理这个事件,系统会继续把事件传递给上层监听器,或者触发View的默认长按行为。
内容的提问来源于stack exchange,提问作者Dylan Hargett
相关产品推荐
相关产品推荐

