Как правильно использовать 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.


person Dylan Hargett    schedule 07.04.2018    source источник


Ответы (5)


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

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
}
person Samuel Eminet    schedule 07.04.2018
comment
Отличный ответ. Мы хотели бы добавить одну мысль, когда вы пытаетесь построить это, компилятор жалуется, ЕСЛИ оператор return или true не добавляется перед любыми другими строками кода между открытием и закрытием, которые для новичка или новичка поверят тому, что вводится неправильно Просто мысль - person Vector; 20.09.2018
comment
Спасибо, Самуэль - person RKRK; 18.10.2018
comment
Помните, что вы можете получить доступ к представлению, переданному слушателем, используя переменную it внутри функции Kotlin. - person Luis Cabrera Benito; 15.10.2019
comment
Для меня это была маркировка моей структуры if/else красным цветом, поэтому я подумал, что не написал правильное сравнение. Какое-то время это действительно сбивало с толку, я потратил 20 минут, перепечатывая свои скобки, чтобы убедиться, что они верны (а они были). - person The Fox; 04.11.2019

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

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

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

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

В файле 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 с любой функцией, требующей истинного значения, например onCreateOptionsMenu и onOptionsItemSelected, без явной необходимости возвращать истинное значение.

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

person MohammadL    schedule 04.09.2019

Мне это понравилось.

Внутри onCreate

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

А потом

private var timeButtonLongClickListener = View.OnLongClickListener {
    true
}
person Water    schedule 03.11.2019

Этот также работает для Kotlin. Просто верните истину

view.setOnLongClickListener {
    Toast.makeText(this,"This is a long click",Toast.LENGTH_SHORT).show(); 
    true
}
person Bashi Lenny    schedule 26.12.2020
comment
вы можете использовать блок кода для раздела кода, который сделает ваш вопрос/ответ потрясающим. - person Chandan; 26.12.2020
comment
Я считаю, что ваше решение идентично принятому решению. - person tronman; 22.05.2021