Hoe bouw je een lambda-expressie voor de EditText addTextChangeListener in Kotlin? Hieronder geeft een foutmelding:
passwordEditText.addTextChangedListener { charSequence ->
try {
password = charSequence.toString()
} catch (error: Throwable) {
raise(error)
}
}
Antwoord 1, autoriteit 100%
addTextChangedListener()
neemt een TextWatcher
wat een interface is met 3 methoden. Wat je schreef zou alleen werken als TextWatcher
maar 1 methode had. Ik ga ervan uit dat de fout die je krijgt te maken heeft met het feit dat je lambda de andere twee methoden niet implementeert. Je hebt in de toekomst twee opties.
- Laat de lambda achterwege en gebruik gewoon een anonieme innerlijke klasse
editText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
})
- Maak een extensiemethode zodat je een lambda-expressie kunt gebruiken:
fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) {
this.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(editable: Editable?) {
afterTextChanged.invoke(editable.toString())
}
})
}
En gebruik dan de extensie als volgt:
editText.afterTextChanged { doSomethingWithText(it) }
Antwoord 2, autoriteit 23%
Voeg deze kern-ktx-afhankelijkheid toe
implementation 'androidx.core:core-ktx:1.0.0'
Je moet gewoon doen
passwordEditText.doAfterTextChanged{ }
Antwoord 3, autoriteit 9%
Een beetje oud, maar met Kotlin Android-extensies kun je zoiets doen:
editTextRequest.textChangedListener {
afterTextChanged {
// Do something here...
}
}
Geen extra code nodig, voeg gewoon toe:
implementation 'androidx.core:core-ktx:1.0.0'