Android TextWatcher.afterTextChangedとTextWatcher.onTextChanged


121

どのような状況afterTextChangedonTextChanged、代わりに、またはその逆に使用する必要がありますか?

回答:


199

これらのイベントは次の順序で呼び出されます。

  1. beforeTextChanged(CharSequence s、int start、int count、int after)
    これは、文字が新しいテキストで置き換えられようとしていることを意味します。テキストは編集できません。
    使用:変更される古いテキストを確認する必要がある場合。

  2. onTextChanged(CharSequence s、int start、int before、int count)
    変更が加えられ、一部の文字が置き換えられました。テキストは編集できません。
    使用:テキスト内のどの文字が新しいかを確認する必要がある場合。

  3. afterTextChanged(Editable s)
    上記と同じですが、テキストが編集可能です。
    使用:新しいテキストを表示し、場合によっては編集する必要がある場合。

で変更をリッスンしているだけの場合EditText、最初の2つの方法を使用する必要はまったくありません。3番目の方法で新しい値を受け取り、必要に応じて新しいテキストを修正します。ただし、値に発生する正確な変更を追跡する必要がある場合は、最初の2つの方法を使用します。変更を聞いた後でテキストも編集する必要がある場合は、3番目の方法で編集します。


onTextChangedでテキストを変更するとANRが発生する理由を理解するのに役立ちました。
Sukhvir Singh

12

public void afterTextChanged(Editable s)

このメソッドはs、テキストが変更されたことを通知するために呼び出されます。sこのコールバックからさらに変更を加えることは正当ですが、変更を加えるとこのメソッドが再帰的に呼び出されるため、無限ループに陥らないように注意してください。(他のafterTextChanged()メソッドがすでに他の変更を行ってオフセットを無効にした可能性があるため、どこで変更が行われたかはわかりません。ただし、ここで知る必要がある場合は、を使用setSpan(Object, int, int, int)onTextChanged(CharSequence, int, int, int)て場所にマークを付け、ここからどこから検索するかを指定できます。スパンが終わった。

public void beforeTextChanged(CharSequence s、int start、int count、int after)

このメソッドは、内sで、でcount始まるstart文字が長さの新しいテキストに置き換えられることを通知するために呼び出されますaftersこのコールバックから変更を試みるとエラーになります。

public void onTextChanged(CharSequence s、int start、int before、int count)

このメソッドは、内sで、でcount始まる文字startが、長さのある古いテキストを置き換えただけであることを通知するために呼び出されますbeforesこのコールバックから変更を試みるとエラーになります。

右からTextWatcherのためのAndroidのリファレンス


なぜAPIコードをコピーするのですか?多くの場合、APIは「人間が読めない」ものです。
matua

@matuaこの質問/回答は11年以上前のものです。
GregD

その後、コメントはブロックされるはずです:)
matua

0

Android Textwatcher 入力フィールドのテキスト変更時に呼び出されるトリガーの一種です。

afterTextChanged (Editable s)-このメソッドは、テキストが変更されたときに呼び出されます。変更を加えると、このメソッドが再帰的に呼び出されるため、ここでの操作の実行に注意する必要があります。そうしないと、無限ループにつながる可能性があります

onTextChanged (CharSequence s, int start, int before, int count)-このメソッドは、s内で、startで始まるカウント文字が、以前に長さを持っていた古いテキストを置き換えただけであることを通知するために呼び出されます。このコールバックからsを変更しようとすると、エラーになります。


6
ドキュメントをコピーして貼り付けても役に立たず、質問に回答できません。
David Wasser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.