2016-11-13 2 views
15

Как вы создаете лямбда-выражение для EditText addTextChangeListener в Котлин? Ниже приводится сообщение об ошибке:Kotlin addTextChangeListener lambda?

passwordEditText.addTextChangedListener { charSequence -> 
    try { 
     password = charSequence.toString() 
    } catch (error: Throwable) { 
     raise(error) 
    } 
} 
+1

Какая ошибка это дает? – voddan

ответ

0

Это выглядит аккуратно:

passwordEditText.setOnEditorActionListener { 
    textView, keyCode, keyEvent -> 
    try { 
     val DONE = 6 
     if (keyCode == DONE) { 
      password = passwordEditText.text.toString() 
     } 
    } catch (error: IllegalStateException) { 
     alert("Invalid Input!", error.message as String) 
     passwordEditText.text.clear() 
    } catch (error: Exception) { 
     raise(error) 
    } 
    false 
} 
47

addTextChangedListener() занимает TextWatcher, который является интерфейсом с 3-мя методами. То, что вы написали, будет работать только в том случае, если TextWatcher имел только 1 метод. Я собираюсь угадать, что ошибка, которую вы получаете, связана с вашей лямбдой, не реализующей другие 2 метода. У вас есть 2 варианта вперёд.

1) Ditch лямбда и просто использовать анонимный внутренний класс

editText.addTextChangedListener(object : TextWatcher { 
    override fun afterTextChanged(p0: Editable?) { 
    } 

    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
    } 

    override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
    } 
}) 

2) Создать метод расширения, так что вы можете использовать лямбда-выражение:

fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) { 
    this.addTextChangedListener(object : TextWatcher { 
     override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
     } 

     override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
     } 

     override fun afterTextChanged(editable: Editable?) { 
     afterTextChanged.invoke(editable.toString()) 
     } 
    }) 
} 

И затем использовать расширение как так:

editText.afterTextChanged { doSomethingWithText(it) } 
+2

Не уверен, что личные предпочтения или лучший стиль, но ваша функция расширения может быть преобразована в тело выражения ('fun foo() = ...') –

+1

@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Вы правы, что его можно преобразовать. Однако для функций длиной более одной строки мне нравится иметь окружающие скобки, чтобы четко обозначать, где функция запускается и останавливается. Я считаю, что это повышает читаемость, но это полностью предпочтение стиля. Я думаю, это можно было бы утверждать в обоих направлениях :) –

+0

@LEM Adane, пожалуйста, примите этот ответ, если он вам поможет. –

0

Другой альтернативой является найденная библиотека KAndroidhere.

Тогда вы могли бы сделать что-то вроде этого ...

editText.textWatcher { afterTextChanged { doSomething() } } 

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

Смежные вопросы