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