Kotlin addTextChangeListener lambda?

如何为Kotlin中的EditText addTextChangeListener构建一个lambda表达式? 下面给出一个错误:

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

addTextChangedListener()需要一个TextWatcher ,它是一个3种方法的接口。 只有TextWatcher只有1个方法,你写的东西才会起作用。 我要猜测你得到的错误与你的lambda没有实现其他两种方法有关。 你有2个选择前进。

1)抛开拉姆达,只使用一个匿名的内部类

 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)创建一个扩展方法,以便您可以使用lambda表达式:

 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) } 

这看起来很整齐:

 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 } 

另一种选择是在这里找到的KAndroid库。

然后你可以做这样的事情…

 editText.textWatcher { afterTextChanged { doSomething() } } 

显然,使用整个库来解决您的问题是过分的,但它也带有一系列其他有用的扩展,消除Android SDK中的样板代码。