1. ホーム
  2. android

複数のEditTextに対応するTextWatcher

2023-12-15 18:29:27

質問

を実装したいのですが TextWatcher インターフェイスを実装したいのですが、複数の EditText フィールドを使用することができます。現在、私は:

text1.addTextChangedListener(this);
text2.addTextChangedListener(this);

で、そのメソッドをActivityでオーバーライドします。

public void afterTextChanged(Editable s) {}

public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) 
{
 // do some operation on text of text1 field
 // do some operation on text of text2 field 
}

しかし、これはうまくいっていますが、私は他の方法を探しています。 EditText フィールドが SoftKeyboard は現在フォーカスされています。

どのように解決するのですか?

での解決策を提案します。 Sebastian Roth さんの回答 のインスタンスは1つではありません。 TextWatcher に対して、いくつかの EditTexts . これは1つのクラスとそのクラスのn個のインスタンスで、n個の EditTexts .

各EditTextはそれぞれSpanableを持ちます。 TextWatcher のイベントには、このSpanableが s というパラメータがあります。myEditText1.getText()はそのSpannableを返します。そのため、もし myEditText1.getText().hashCode() と等しい場合は s.hashCode() ということは s に属している myEditText1

のインスタンスを一つ持ちたい場合、そのインスタンスは TextWatcher に対して、ある EditTexts を使うべきでしょう。

private TextWatcher generalTextWatcher = new TextWatcher() {    

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {

        if (myEditText1.getText().hashCode() == s.hashCode())
        {
            myEditText1_onTextChanged(s, start, before, count);
        }
        else if (myEditText2.getText().hashCode() == s.hashCode())
        {
            myEditText2_onTextChanged(s, start, before, count);
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {

        if (myEditText1.getText().hashCode() == s.hashCode())
        {
            myEditText1_beforeTextChanged(s, start, count, after);
        }
        else if (myEditText2.getText().hashCode() == s.hashCode())
        {
            myEditText2_beforeTextChanged(s, start, count, after);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
        if (myEditText1.getText().hashCode() == s.hashCode())
        {
            myEditText1_afterTextChanged(s);
        }
        else if (myEditText2.getText().hashCode() == s.hashCode())
        {
            myEditText2_afterTextChanged(s);
        }
    }

};

myEditText1.addTextChangedListener(generalTextWatcher);
myEditText2.addTextChangedListener(generalTextWatcher);