TextWatcherでオーバーライドしなきゃいけないメソッド多すぎじゃない?
Android開発していて一番頻繁に使うであろうUIの一つにEditTextがあると思います。
ユーザーに文字列を入力できるような機能を提供するときには必ずと言っていいほど使いますよね。
ただ、一つ問題があるんです。
入力された文字列を取得する際に使うTextWatcherというinterface
こいつ、いちいち3つのメソッド全部オーバーライドしなきゃいけない・・・。
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) {
//処理
}
})
正直な話、3つを全て使い分ける場面ってそんなにないんです。
個人的にはafterTextChangedだけでだいたい事足りるのではないかと思っています(もちろん使い分けるべき場面もありますが)。
つまり
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) {
//うわ・・・ここも使わない・・・いらない・・・
}
})
こうなってしまうわけですね。
この書き方自体に何か大きな問題があるというわけはないんですが、わざわざ使わないメソッドを書かなきゃいけないのってなんかダサいし、コードもごちゃごちゃして読みづらくなるので避けたいです。EditTextが一つだけだとそんなに問題にならないのですが、アカウントの登録などで複数のフォームを実装する場合、途端にコードが膨れ上がってごちゃごちゃしてきます。
そこで、どうにかしてafterTextChangedだけをオーバーライドしてスッキリさせる方法はないかと考えて思いついたのがこちら。
まず、TextWacherを継承した独自のinterfaceを定義しましょう。
ここではCustomTextWatcherと命名します(適当)
interface CustomTextWatcher: TextWatcher{
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
}
ここでキモになってくるのは、beforeTextChangedとonTextChangedをオーバーライドして実装しちゃうってこと。そうすることでこのinterfaceを実装するときにafterTextChangedだけをオーバーライドするだけで事足りちゃいます。
それではaddTextChangedListenerの引数に入れて確かめて見ましょう。
その結果がコチラ!!
editText.addTextChangedListener(object: CustomTextWatcher{
override fun afterTextChanged(p0: Editable?) {
//ここに処理を書く
}
})
これでスッキリかけるようになっちゃました〜
皆さんもぜひお試しあれ。
間違っているところやもっと良い書き方などありましたら、ご指摘いただければと思います。