Как правильно использовать setOnLongClickListener() с Kotlin

Я пытаюсь настроить событие с длинным кликом, но продолжаю получать следующую ошибку:

Type mismatch. 

Required:Boolean

Found:Unit

У меня не было проблем с событием setOnClickListener, но по какой-то причине мне не повезло с событием setOnLongClickListener.

В настоящее время я пытаюсь показать простой Toast:

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

Я видел много примеров для Java, но я еще не нашел примеров для Kotlin.

Ответы

Ответ 1

Подпись OnLongClickListener.onLongClick требовала, чтобы вы возвращали логическое значение, чтобы уведомить, действительно ли вы использовали событие

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

или же

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

Ответ 2

Другим способом может быть это...

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

Ответ 3

Встроенные функции

Вы можете сделать встроенную функцию, которая потребляет функцию и возвращает логическое значение. Затем используйте его с любыми функциями, для которых в качестве возвращаемого типа требуется логическое значение.

В файле котлина:

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

Использование:

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

Теперь ваш код будет работать и вернет истинное значение для удовлетворения потребности в методе setOnLongClickListener. Вы можете повторно использовать эту функцию consume с любой функцией, для которой требуется истинное значение, например onCreateOptionsMenu и onOptionsItemSelected, без явной необходимости возвращать истинное значение.

Этот способ использует: встроенные функции. И решение, которое вы выбрали в качестве наилучшего ответа, использует: помеченный возврат.