2016-11-13 16 views
15

KotlinのEditText addTextChangeListenerのラムダ式を作成するにはどうすればよいですか?以下のエラーを与える:Kotlin addTextChangeListener lambda?

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

エラーは何ですか? – voddan

答えて

0

これはきちんと見えます:

を210
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()は、3つの方法とのインタフェースであるTextWatcherをとります。あなたが書いたことは、TextWatcherが1つしか方法を持っていなかった場合にのみ働くでしょう。他の2つのメソッドを実装していないラムダに関連するエラーを推測します。 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匿名の内部クラスを使用します)あなたはラムダ式使用できるように拡張メソッドを作成します。

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あなたはそれが変換できるのは正しい。しかし、1行よりも長い関数の場合、関数の開始と終了位置を明確に示すために角カッコを囲むのが好きです。私はそれが可読性を高めると信じていますが、それはまったくスタイルの好みです。私はそれが両方の方法を議論することができると思う:) –

+0

@LEM Adaneそれがあなたを助けたらこの答えを受け入れてください。 –

0

もう1つの方法は、KAndroidライブラリが見つかったhereです。あなたはこのような何かを行うことができその後

...

editText.textWatcher { afterTextChanged { doSomething() } } 

明らかにあなたの問題を解決するために、ライブラリ全体を使用して過剰であるが、それはまた、定型的なコードを排除する他の便利な拡張機能の範囲が付属していますAndroid SDKの