2016-11-13 1 views
15

Wie erstellt man einen Lambda-Ausdruck für den EditText addTextChangeListener in Kotlin? Unten gibt einen Fehler:Kotlin addTextChangeListener Lambda?

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

Welchen Fehler gibt es? – voddan

Antwort

0

Das sieht ordentlich:

47

addTextChangedListener() nimmt eine TextWatcher, die mit 3 Methoden eine Schnittstelle ist. Was Sie geschrieben haben, funktioniert nur, wenn TextWatcher nur 1 Methode hatte. Ich gehe davon aus, dass der Fehler, den Sie bekommen, mit Ihrem Lambda zusammenhängt und die anderen beiden Methoden nicht implementiert. Sie haben 2 Optionen für die Zukunft.

1) Graben das Lambda und verwende nur eine anonyme innere Klasse

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) eine Verlängerung Methode erstellen, so dass Sie einen Lambda-Ausdruck verwenden:

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

Und dann die Erweiterung verwenden wie so:

editText.afterTextChanged { doSomethingWithText(it) } 
+2

Nicht sicher, ob persönliche Präferenz oder besser Stil, aber Ihre Erweiterungsfunktion auf einen Ausdruck Körper umgewandelt werden könnte ('Spaß foo() = ...') –

+1

@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Du hast Recht, dass sie umgesetzt werden können. Bei Funktionen, die länger als eine Zeile sind, möchte ich jedoch, dass umgebende Klammern deutlich markieren, wo die Funktion startet und stoppt. Ich glaube, es erhöht die Lesbarkeit, aber es ist total eine Stilvorliebe. Ich denke, es könnte in beide Richtungen argumentiert werden :) –

+0

@LEM Adane bitte akzeptieren Sie diese Antwort, wenn es Ihnen geholfen hat. –

0

Eine weitere Alternative ist die KAndroid-Bibliothek, die here gefunden wurde.

Dann sind Sie so etwas tun könnten ...

editText.textWatcher { afterTextChanged { doSomething() } } 

Offensichtlich ist es übermäßig eine ganze Bibliothek zu verwenden, um Ihr Problem zu lösen, aber es kommt auch bei einer Reihe von anderen nützlichen Erweiterungen, die vorformulierten Code beseitigen im Android SDK.

Verwandte Themen