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つの説明を与えることができますか?
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:「こんにちは」
後:「こんにちは」
beforeTextChanged
とonTextChanged
のパラメーターは、最初は理解するのが少し難しいです。例で使用されているのを確認すると役立つ場合があります。次のデモを数回ご覧ください。カウントに注意してください。
start
は、赤で強調表示されたテキスト(削除しようとしているテキスト)の開始インデックスです。count
は、red強調表示されたテキスト(削除されようとしている)の長さですafter
は、green強調表示されたテキスト(追加されようとしている)の長さですstart
は、緑色で強調表示されたテキスト(追加されたばかり)の開始インデックスです。start
のbeforeTextChanged
と同じです。before
は、red強調表示されたテキスト(削除されたばかり)の長さです。count
のbeforeTextChanged
と同じです。count
は、green強調表示されたテキスト(追加されたばかり)の長さです。after
のbeforeTextChanged
と同じです。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>
Android TextChangedListener
は、入力フィールドのテキストの変更時に呼び出されるトリガーの一種です。
TextChangedListener
には3つのイベントがあります。
1.beforeTextChanged:これは、文字が新しいテキストに置き換えられることを意味します。テキストは編集できません。このイベントは、変更しようとしている古いテキストを確認する必要がある場合に使用されます。
2.onTextChanged:変更が行われ、一部の文字が置き換えられました。テキストは編集できません。このイベントは、テキスト内のどの文字が新しいかを確認する必要があるときに使用されます。
.afterTextChanged:上記と同じですが、テキストが編集可能になりました。このイベントは、新しいテキストを表示し、場合によっては編集する必要があるときに使用されます。
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文字が、以前の長さの古いテキストを置き換えたことを通知するために呼び出されます。
もっと学ぶことができます こちら 。
afterTextChanged(Editable s)-このメソッドは、テキストが変更されたときに呼び出されます。変更を加えると、このメソッドが再帰的に再度呼び出されるため、ここで操作を実行することに注意する必要があります。そうしないと、無限ループにつながる可能性があります。
beforeTextChanged(CharSequence s、int start、int count、int after)-このメソッドは、s内で、startで始まるcount文字が長さの新しいテキストに置き換えられることを通知するために呼び出されます後。このコールバックからsを変更しようとするとエラーになります。
onTextChanged(CharSequence s、int start、int before、int count)-このメソッドは、s内で、startで始まるcount文字が以前の長さの古いテキストを置き換えたことを通知するために呼び出されます。このコールバックからsを変更しようとするとエラーになります。