android – How to properly use setOnLongClickListener() with Kotlin-ThrowExceptions

Exception or error:

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.

How to solve:

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
}

Leave a Reply

Your email address will not be published. Required fields are marked *