Kotlin addTextChangeListener lambda?

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 TextWatcherwat een interface is met 3 methoden. Wat je schreef zou alleen werken als TextWatchermaar 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.

  1. 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) {
      }
    })
  1. 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'

Other episodes