如何正确使用setOnLongClickListener()与Kotlin

时间:2018-04-07 22:39:43

标签: android kotlin onlongclicklistener

我一直在尝试设置长时间点击监听器事件,但不断收到以下错误:

Type mismatch. 

Required:Boolean

Found:Unit

我对setOnClickListener事件没有任何问题,但由于某种原因,我对setOnLongClickListener事件没有运气。

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

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

我见过很多关于Java的例子,但我还没有找到Kotlin的任何例子。

5 个答案:

答案 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与任何需要真值的函数一起重用,例如onCreateOptionsMenuonOptionsItemSelected,而无需明确地返回真值。

这种方式使用: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
}