web-dev-qa-db-ja.com

Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

どのような状況でafterTextChangedの代わりにonTextChangedを使用する必要がありますか?

110
Will

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

  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番目の方法でそれを行います。

182
Malcolm

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文字が長さafterの新しいテキストに置き換えられることを通知するために呼び出されます。このコールバックからsを変更しようとするとエラーになります。

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

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

AndroidのTextWatcherのリファレンス から直接。

12
GregD

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

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

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

0
IntelliJ Amiya