Как установитьOnEditorActionListener с Kotlin
Итак, у меня есть этот код Java:
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
doSomething();
return true;
}
return false;
}
});
Мне удалось получить это (что я даже не уверен в этом):
editText.setOnEditorActionListener() { v, actionId, event ->
if(actionId == EditorInfo.IME_ACTION_DONE){
doSomething()
} else {
}
}
Но я получаю сообщение об ошибке Error:(26, 8) Type mismatch: inferred type is kotlin.Unit but kotlin.Boolean was expected
Итак, как этот обработчик событий написан в Котлин?
Ответы
Ответ 1
onEditorAction
возвращает Boolean
то время как ваша Kotlin лямбда возвращает Unit
. Измените это на ie:
editText.setOnEditorActionListener { v, actionId, event ->
if(actionId == EditorInfo.IME_ACTION_DONE){
doSomething()
true
} else {
false
}
}
Документация по лямбда-выражениям и анонимным функциям хороша для чтения.
Ответ 2
Kotlin был бы хорош с когда ключевое слово вместо использования, если еще
Для меня следующий код более симпатичен:
editText.setOnEditorActionListener() { v, actionId, event ->
when(actionId)){
EditorInfo.IME_ACTION_DONE -> { doSomething(); true }
else -> false
}
}
p/s: код @Pier не работает из-за выражения, необходимого справа от лямбды. Таким образом, мы должны использовать true/false вместо возврата true/false
Ответ 3
Вы можете использовать другую форму:
editText.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
doSomething()
true
} else {
false
}
}
Ответ 4
Напишите простое расширение Kotlin для EditText
fun EditText.onAction(action: Int, runAction: () -> Unit) {
this.setOnEditorActionListener { v, actionId, event ->
[email protected] when (actionId) {
action -> {
runAction.invoke()
true
}
else -> false
}
}
}
и использовать это
/**
* use EditorInfo.IME_ACTION_DONE constant
* or something another from
* @see android.view.inputmethod.EditorInfo
*/
edit_name.onAction(EditorInfo.IME_ACTION_DONE) {
// code here
}