Как установить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
}