简体   繁体   中英

How to properly use setOnLongClickListener() with Kotlin

I've been trying to set up a long click listener event, but keep getting the following error:

Type mismatch. 

Required:Boolean

Found:Unit

I've had no issues with the setOnClickListener event, but for some reason I'm having zero luck with the setOnLongClickListener event.

I'm currently trying to display a simple Toast :

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

I've seen plenty of examples for Java, but I'm yet to find any examples for Kotlin.

OnLongClickListener.onLongClick signature required that you return a boolean to notify if you actually consumed the event

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

or

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

Another way can be this...

view.setOnLongClickListener{
    dispathAnEventOnLongClick("Long click detected!");
}
private fun dispathAnEventOnLongClick(text:CharSequence): Boolean {
    Toast.makeText(applicationContext,text,Toast.LENGTH_SHORT).show();
    return true;
}

Inline Functions

You can make an inline function that consume a function and return a boolean. Then use it with any functions that required a boolean as return type.

In a kotlin file:

inline fun consume(function: () -> Unit): Boolean {
    function()
    return true
}

Usage:

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

Now your code will work and returned a true value to satisfied the need for setOnLongClickListener method. You can reuse this function consume with any function that require a true value like onCreateOptionsMenu and onOptionsItemSelected without an explicitly needs to return a true value.

This way uses: Inline Functions . And the solution you checked as a best answer uses : Labeled Return .

I did like this.

Inside onCreate,

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

And then,

private var timeButtonLongClickListener = View.OnLongClickListener {
    true
}

This one also works for Kotlin. Simply return true

view.setOnLongClickListener {
    Toast.makeText(this,"This is a long click",Toast.LENGTH_SHORT).show(); 
    true
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM