web-dev-qa-db-ja.com

TextWatcherのonTextChanged、beforeTextChanged、afterTextChangedの違い

Androidプロジェクトでは、編集テキストビューにTextChangedListener(TextWatcher)を追加する必要がありました。3つの部分があります。

  • onTextChanged()
  • beforeTextChanged()
  • afterTextChanged()

これら3つの違いは何ですか?キーリスナーでテーブルの検索を実装する必要がありましたが、私の場合、これら3つはすべて同じように見えました。また、彼らは同じように機能しました。製品名の一部を入力すると、入力されたテキストを含む製品のみでテーブルが再描画されます。しかし、afterTextChanged()部分を使用しました。私のコードは:

EditProduct.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

            // System.out.println("onTextChanged"+s);
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
            // System.out.println("beforeTextChanged"+s);
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            // System.out.println("afterTextChanged"+s);

            String new_prx = s.toString();

            System.out.println(s);
            mini_productList = new ArrayList<Product>();

            // mini_productList
            int count = 0;
            if (new_prx.equals("")) {

                loadtableProducts(productList);

            } else {

                for (int i = 0; i < productList.size(); i++) {

                    if (productList.get(i).getDescription().toString()
                            .substring(0, (new_prx.length()))
                            .equalsIgnoreCase(new_prx)) {
                        mini_productList.add(productList.get(i));
                        count++;

                    }
                }

                loadtableProducts(mini_productList);
            }
        }
    });

だから、誰かが私にこれらの3つの説明を与えることができますか?

34

onTextChangedは、テキストの変更中に実行されます。

afterTextChangedは、テキストが変更された直後に実行されます。

beforeTextChangedは、テキストが変更される前にインスタントを実行します。

変数を割り当てるタイミングや処理を行うタイミングに応じて、変更の直前または直後にコードを実行できます。

次に例を示します。

String afterTextChanged = "";
String beforeTextChanged = "";
String onTextChanged = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et = (EditText)findViewById(R.id.editText);

    et.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int st, int b, int c) 
        {
            onTextChanged = et.getText().toString();
        }

        @Override
        public void beforeTextChanged(CharSequence s, int st, int c, int a) 
        {
            beforeTextChanged = et.getText().toString();
        }

        @Override
        public void afterTextChanged(Editable s) 
        {
            afterTextChanged = et.getText().toString();
            Toast.makeText(Activity.this, "before: " + beforeTextChanged
                                           + '\n' + "on: " + onTextChanged 
                                           + '\n' + "after: " + afterTextChanged
                           ,Toast.LENGTH_SHORT).show();
        }
    });
}

この場合、テキストを「h」から「hi」に変更すると、出力は次のようになります。

前:「h」
on:「こんにちは」
後:「こんにちは」

23

beforeTextChangedonTextChangedのパラメーターは、最初は理解するのが少し難しいです。例で使用されているのを確認すると役立つ場合があります。次のデモを数回ご覧ください。カウントに注意してください。

  • redハイライトは、緑色のテキストに置き換えられようとしている古いテキストです。
  • greenハイライトは、赤いテキストを置き換えたばかりの新しいテキストです。

enter image description here

beforeTextChanged

  • startは、赤で強調表示されたテキスト(削除しようとしているテキスト)の開始インデックスです。
  • countは、red強調表示されたテキスト(削除されようとしている)の長さです
  • afterは、green強調表示されたテキスト(追加されようとしている)の長さです

onTextChanged

  • startは、緑色で強調表示されたテキスト(追加されたばかり)の開始インデックスです。
    これは、startbeforeTextChangedと同じです。
  • beforeは、red強調表示されたテキスト(削除されたばかり)の長さです。
    これは、countbeforeTextChangedと同じです。
  • countは、green強調表示されたテキスト(追加されたばかり)の長さです。
    これは、afterbeforeTextChangedと同じです。

afterTextChanged

  • editableは、EditTextの編集可能なテキストです。ここで変更できます。そうすると、すべてのTextWatcherイベントが再びトリガーされます。
  • 変更内容に関する情報は提供されません。知りたい場合は、onTextChangedにスパンを設定して、ここでスパンを検索できます。

どちらを使用するか?

行われている変更を確認する場合は、beforeTextChanged()またはonTextChanged()を使用します。ただし、これらのメソッドのいずれでもCharSequenceテキストを変更することはできません。

変更後にテキストをさらに変更する場合は、afterTextChanged()で行ってください。

コード

自分で試してみたい場合のコードを次に示します。

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    final static int RED_COLOR = Color.parseColor("#fb7373");
    final static int GREEN_COLOR = Color.parseColor("#40de83");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.editText);
        final TextView tvBeforeText = findViewById(R.id.tvBeforeText);
        final TextView tvBeforeNumbers = findViewById(R.id.tvBeforeNumbers);
        final TextView tvAfterText = findViewById(R.id.tvAfterText);
        final TextView tvAfterNumbers = findViewById(R.id.tvAfterNumbers);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                SpannableString spannableString = new SpannableString(s);
                BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(RED_COLOR);
                spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tvBeforeText.setText(spannableString);
                tvBeforeNumbers.setText("start=" + start + "  count=" + count + " after=" + after);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                SpannableString spannableString = new SpannableString(s);
                BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(GREEN_COLOR);
                spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tvAfterText.setText(spannableString);
                tvAfterNumbers.setText("start=" + start + " before=" + before + " count=" + count);
            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.i("TAG", "afterTextChanged: " + s);
            }
        });
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:padding="5dp">

    <EditText
        Android:id="@+id/editText"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textSize="20sp"
        Android:text="beforeTextChanged" />

    <TextView
        Android:id="@+id/tvBeforeText"
        Android:textSize="17sp"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />

    <TextView
        Android:id="@+id/tvBeforeNumbers"
        Android:textSize="17sp"
        Android:text="start=0 count=0 after=0"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textSize="20sp"
        Android:layout_marginTop="20dp"
        Android:text="onTextChanged" />

    <TextView
        Android:id="@+id/tvAfterText"
        Android:textSize="17sp"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />

    <TextView
        Android:id="@+id/tvAfterNumbers"
        Android:textSize="17sp"
        Android:text="start=0 count=0 after=0"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />
</LinearLayout>
37
Suragch

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

TextChangedListenerには3つのイベントがあります。

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

2.onTextChanged:変更が行われ、一部の文字が置き換えられました。テキストは編集できません。このイベントは、テキスト内のどの文字が新しいかを確認する必要があるときに使用されます。

.afterTextChanged:上記と同じですが、テキストが編集可能になりました。このイベントは、新しいテキストを表示し、場合によっては編集する必要があるときに使用されます。

20
Jigar Pandya
  • abstract void afterTextChanged(Editable s)

このメソッドは、s内のどこかでテキストが変更されたことを通知するために呼び出されます。

  • abstract void beforeTextChanged(CharSequence s, int start, int count, int after)

このメソッドは、s内で、startで始まるcount文字がlengthの新しいテキストで置き換えられようとしていることを通知するために呼び出されます。

  • abstract void onTextChanged(CharSequence s, int start, int before, int count)

このメソッドは、s内で、startで始まるcount文字が、以前の長さの古いテキストを置き換えたことを通知するために呼び出されます。

もっと学ぶことができます こちら

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

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

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

0
user2666607