Android EditText の TextWatcher をラムダで簡略化

はじめに

今回は、Androidのリスナーをラムダを使用して簡略化する方法を紹介します。
例として、EditTextのTextWatcherをサンプルとして扱ってみます。

TextWatcherとは、EditTextが入力された文字を通知するリスナーのことです。
以下のように、入力された文字を検知することができます。(非常に冗長ですね)

editText.addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        
    }

    override fun afterTextChanged(s: Editable?) {
        
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        Log.d("テキストが入力されました : $s")
    }
})

解決

そこで、以下のような Kotlin Extension を作成してみましょう。
こうすることで、冗長だったTextWatcherを簡略化することができます。

fun EditText.setOnChangedTextListener(onChangedTextListener: (String) -> Unit) {
    addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            // do nothing
        }

        override fun afterTextChanged(s: Editable?) {
            // do nothing
        }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            onChangedTextListener(s.toString())
        }
    })
}

使用する側はこんな形で書くことができるようになりました。

editText.setOnChangedTextListener {
    Log.d("テキストが入力されました : $s")
}