如何在Kotlin中正确使用setOnLongClickListener()

52

我一直在尝试设置长按监听器事件,但是始终遇到以下错误:

Type mismatch. 

Required:Boolean

Found:Unit

我对于setOnClickListener事件没有任何问题,但是由于某些原因使用setOnLongClickListener事件时一直不成功。

我目前正尝试展示一个简单的Toast

view.setOnLongClickListener{
    Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show();
}

我已经看过很多Java的例子,但我还没有找到任何Kotlin的例子。

5个回答

135

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
}

2
优秀的回答。当您尝试构建此代码时,我们想添加一个思路:如果在开头和结尾之间添加了其他行代码,并且没有添加“return”或“true”语句,编译器会抱怨。对于初学者或新手来说,他们可能会认为输入的内容是错误的。这只是一个思路。 - Vector
谢谢你,Samuel。 - RKRK
请记住,您可以在Kotlin函数内使用“it”变量访问由监听器传递的视图。 - Luis Cabrera Benito
对我来说,我的if/else结构被标记为红色,所以我认为我没有编写正确的比较。那真的很令人困惑,花了20分钟重新输入括号以确保它们是正确的(它们是正确的)。 - The Fox

5
这个方法同样适用于Kotlin。只需简单地返回真。
view.setOnLongClickListener {
    Toast.makeText(this,"This is a long click",Toast.LENGTH_SHORT).show(); 
    true
}

你可以使用代码块来展示代码部分,这将使你的问题/答案更加出色。 - Chandan
1
我相信你的解决方案与已接受的解决方案完全相同。 - tronman

2
"最初的回答" 可以是另一种方法是这样的...
view.setOnLongClickListener{
    dispathAnEventOnLongClick("Long click detected!");
}
private fun dispathAnEventOnLongClick(text:CharSequence): Boolean {
    Toast.makeText(applicationContext,text,Toast.LENGTH_SHORT).show();
    return true;
}

2
我这样做了。

在onCreate方法内,

    findViewById<Button>(R.id.myButton).setOnLongClickListener(myButtonLongClickListener)

然后,

private var timeButtonLongClickListener = View.OnLongClickListener {
    true
}

1

内联函数

你可以创建一个消费函数并返回布尔值的内联函数。然后将其与任何需要布尔类型返回值的函数一起使用。

在 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与任何需要真值的函数一起重复使用,比如onCreateOptionsMenuonOptionsItemSelected,无需显式返回一个真值。
这种方式使用了内联函数。而你选中的最佳答案使用了标记返回

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接