我一直在尝试设置长时间点击监听器事件,但不断收到以下错误:
Type mismatch.
Required:Boolean
Found:Unit
我对setOnClickListener
事件没有任何问题,但由于某种原因,我对setOnLongClickListener
事件没有运气。
我目前正在尝试展示一个简单的Toast
:
view.setOnLongClickListener{
Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show();
}
我见过很多关于Java的例子,但我还没有找到Kotlin的任何例子。
答案 0 :(得分:26)
OnLongClickListener.onLongClick
签名要求您返回一个布尔值以通知您是否实际使用了该事件
view.setOnLongClickListener{
Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show()
return@setOnLongClickListener true
}
或
view.setOnLongClickListener{
Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show()
true
}
答案 1 :(得分:0)
这是另一种方式...
view.setOnLongClickListener{
dispathAnEventOnLongClick("Long click detected!");
}
private fun dispathAnEventOnLongClick(text:CharSequence): Boolean {
Toast.makeText(applicationContext,text,Toast.LENGTH_SHORT).show();
return true;
}
答案 2 :(得分:0)
您可以使内联函数使用一个函数并返回一个布尔值。然后将其与任何需要布尔值作为返回类型的函数一起使用。
在kotlin文件中:
inline fun consume(function: () -> Unit): Boolean {
function()
return true
}
用法:
view.setOnLongClickListener {
consume { Toast.makeText(context, "Long click detected", Toast.LENGTH_SHORT).show() }
}
现在,您的代码可以使用并返回一个真值,以满足对setOnLongClickListener
方法的需求。您可以将此函数consume
与任何需要真值的函数一起重用,例如onCreateOptionsMenu
和onOptionsItemSelected
,而无需明确地返回真值。
这种方式使用:Inline Functions。您选择的最佳解决方案使用的是:Labeled Return。
答案 3 :(得分:0)
我确实喜欢这个。
在onCreate内
findViewById<Button>(R.id.myButton).setOnLongClickListener(myButtonLongClickListener)
然后
private var timeButtonLongClickListener = View.OnLongClickListener {
true
}
答案 4 :(得分:0)
这个也适用于 Kotlin。简单地返回真
view.setOnLongClickListener {
Toast.makeText(this,"This is a long click",Toast.LENGTH_SHORT).show();
true
}