AndroidでTextWatcher
による編集可能なEditText
の実装方法を整理する。
導入
Androidの開発で,テキストの入力欄のUIウィジェットにEditText
がある。このEditText
はデータの入力UIとして重宝するのだが,これがまた癖がある。
例えば,素の状態であれば入力した内容をそのままデータとして流用できない。別のButton
などのUIを用意し,そちらの選択時に処理する必要がある。
表示領域の都合などで,処理用のボタンを設置したくない場合がよくある。例えば,EditText
を使ったTextEditor
を作る場合なども困る。
ただ,TextWatcher
を使うことで入力した内容をそのままデータとして活用できる。そこで,TextWatcher
による編集可能なEditText
の実装方法を整理する。
方法
EditText
の公式リファレンス (EditText | Android Developers) に,以下のようにEditText
への入力中の処理の実装方法が書かれている。
TextWatcher
をEditText
に追加することで,ユーザーによるテキストの変更を,コールバックで受け取ることができる。TextView#addTextChangedListener
メソッドの引数に,TextWatcher
の実装を追加することで実現する。
TextWatcher
はEditText
に入力中の内容を監視するインターフェイスとなっている。テキストの入力時に呼ばれるコールバックは,TextWatcherのリファレンスに記載されており,タイミングに応じて以下の3の抽象メソッドが用意されている。
TextWatcher
の抽象メソッドメソッド | 説明 |
---|
abstract void afterTextChanged(Editable s) | テキストの変更後に呼ばれる。 |
abstract void beforeTextChanged(CharSequence s, int start, int count, int after) | テキストの置換前に呼ばれる。
start : 先頭からの位置
count : 変更前の選択文字数
after : 変更後の選択文字数 |
abstract void onTextChanged(CharSequence s, int start, int before, int count) | テキストの置換後に呼ばれる。
start : 先頭からの位置
before : 変更前の選択文字数
count : 変更後の選択文字数 |
beforeTextChanged
は入力の反映前に呼ばれる。onTextChanged
は入力の反映後に呼ばれる。onTextChange
dとafterTextChanged
はタイミングが似ている。
テキストの入力直前に何か処理を行いたい場合,beforeTextChanged
のタイミングでやる。入力直後のタイミングであれば,onTextChanged
とafterTextChanged
のどちらでもいい。afterTextChanged
の中で文字を追加すると,また
afterTextChanged
が呼ばれる。このタイミングを検知する場合に,onTextChanged
が必要になる。それ以外は
afterTextChanged
でいいだろう。
仮引数に同じ変数名のcount
が使われているが,意味が違うことに注意する。
引数の並び順が,入力欄の先頭からの位置 (start
),変更前の選択文字数 (count/before
),変更後の選択文字数 (after/count
) の順番に並んでいると理解すると覚えやすいかもしれない。
例えば,2文字選択して1文字入力する場合count
, after
, before
はそれぞれ以下となる。
beforeTextChanged
: count
=2, after
=1onTextChanged
: before
=2, count
=1
入力直後に何か処理を行いたい場合がほとんどなので,基本的にafterTextChanged
のみ処理を実装することになるだろう。その場合,beforeTextChanged
とonTextChanged
の中身は空となる。
実際に実装する場合,実装先クラスにimplements TextWatcher
を記入し,オーバーライドする。
サンプル
EditText
の内容をTextView
に表示する簡単なサンプルを以下に掲載する。GitHub上にも公開している。
なお,Android 3.5.3で確認した。
EditText
に入力した内容を3の抽象メソッドに対応したTextView
に引数と共に表示させている。
これで,beforeTextChanged
とonTextChanged
の引数の意味について理解できる。
結論
EditText
に入力された内容をTextWatcher
で処理する方法を整理した。
EditText
を扱う上でほぼ必須の処理なので,整理できてよかった。地味に,公式リファレンスのbeforeTextChanged
とonTextChanged
の引数の意味がわかりにくくて,これの意味を理解するのに時間がかかった。
やはり自分で簡単な動作するサンプルを作成してみるのが,手間はかかるものの効果的だと感じた。
今後も,サンプルを作りながら理解を深めていきたい。
関連
“Android:
TextWatcher
による編集可能なEditText
” に対して1件のコメントがあります。