Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.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
Android 如何在Kotlin中正确使用setOnLongClickListener()_Android_Kotlin_Onlongclicklistener - Fatal编程技术网

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

Android 如何在Kotlin中正确使用setOnLongClickListener(),android,kotlin,onlongclicklistener,Android,Kotlin,Onlongclicklistener,我一直在尝试设置长时间单击侦听器事件,但不断出现以下错误: 类型不匹配。 必填项:布尔值 发现:单位 我对setOnClickListener事件没有任何问题,但由于某种原因,我对setOnLongClickListener事件没有任何运气 我当前正在尝试显示一个简单的土司: view.setOnLongClickListener{ Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show(); } 我已

我一直在尝试设置长时间单击侦听器事件,但不断出现以下错误:

类型不匹配。
必填项:布尔值
发现:单位
我对
setOnClickListener
事件没有任何问题,但由于某种原因,我对
setOnLongClickListener
事件没有任何运气

我当前正在尝试显示一个简单的
土司

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

我已经看过很多Java示例,但是我还没有找到Kotlin的示例。

OnLongClickListener。onLongClick
签名要求您返回一个布尔值,以通知您是否实际使用了事件

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


另一种方式可以是

view.setOnLongClickListener{
    dispathAnEventOnLongClick("Long click detected!");
}
private fun dispathAnEventOnLongClick(text:CharSequence): Boolean {
    Toast.makeText(applicationContext,text,Toast.LENGTH_SHORT).show();
    return true;
}
内联函数 您可以创建使用函数并返回布尔值的内联函数。然后将其用于任何需要布尔值作为返回类型的函数

在kotlin文件中:

inline fun consume(function: () -> Unit): Boolean {
    function()
    return true
}
view.setOnLongClickListener {
   consume { Toast.makeText(context, "Long click detected", Toast.LENGTH_SHORT).show() }
}
用法:

inline fun consume(function: () -> Unit): Boolean {
    function()
    return true
}
view.setOnLongClickListener {
   consume { Toast.makeText(context, "Long click detected", Toast.LENGTH_SHORT).show() }
}
现在,您的代码将正常工作并返回一个真值,以满足
setOnLongClickListener
方法的需要。您可以将此函数
consume
与任何需要真值的函数(如
oncreateoptions menu
onoptions itemselected
)重用,而无需显式返回真值

此方法使用:。而您检查为最佳答案的解决方案使用:。

我喜欢这个

内部onCreate,

    findViewById<Button>(R.id.myButton).setOnLongClickListener(myButtonLongClickListener)
private var timeButtonLongClickListener = View.OnLongClickListener {
    true
}

这个也适用于Kotlin。简单地返回true

view.setOnLongClickListener{
Toast.makeText(这是一个长点击),Toast.LENGTH_SHORT.show();
真的
}

很好的答案我们想添加一个想法,当您尝试构造此代码时,编译器会抱怨,如果在开始和结束之间的任何其他代码行之前没有添加return或true语句,初学者或新手会认为输入的是错误的,只是想一想谢谢您,SamuelRemember,您可以访问侦听器通过使用Kotlin函数中的“it”变量传递的视图对我来说,它将我的if/else结构标记为红色,因此我认为我没有编写正确的比较。这在一段时间内确实令人困惑,花了20分钟重新键入我的括号以确保它们是正确的(它们是正确的)。您可以在代码部分使用代码块,这将使您的问题/答案变得非常棒。我相信您的解决方案与公认的解决方案完全相同。