74

TextWatcher複数のEditTextフィールドにインターフェースを実装したい。現在私は使用しています:

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

次に、アクティビティのメソッドをオーバーライドします。

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

4

16 に答える 16

96

@Sebastian Rothの回答で提案されている解決策はTextWatcher、一部のインスタンスの1つではありませんEditTexts。これは、nの1つのクラスとそのクラスのn個のインスタンスですEditTexts

各EditTextには、独自のSpannableがあります。TextWatcherのイベントには、このSpannableがsパラメータとして含まれています。それらのhashCode(各オブジェクトの一意のID)を確認します。myEditText1.getText()は、そのSpannableを返します。したがって、それとmyEditText1.getText().hashCode()等しい場合、それはに属するs.hashCode()ことを意味しますsmyEditText1

したがって、TextWatcher一部のインスタンスを1つ作成する場合は、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);
于 2012-12-09T12:04:28.990 に答える
88

私は次のようにします:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    EditText e = new EditText(this);
    e.addTextChangedListener(new CustomTextWatcher(e));
}

private class CustomTextWatcher implements TextWatcher {
    private EditText mEditText;

    public CustomTextWatcher(EditText e) { 
        mEditText = e;
    }

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

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

    public void afterTextChanged(Editable s) {
    }
}
于 2010-11-26T08:15:38.227 に答える
12

- 編集 -

afterTextChanged のみを使用する場合は、編集可能なものを比較します。

@Override
public void afterTextChanged(Editable editable) {
    if (editable == mEditText1.getEditableText()) {
        // DO STH
    } else if (editable == mEditText2.getEditableText()) {
        // DO STH
    }
}
于 2014-06-18T09:37:19.803 に答える
2

もう1つの方法は、以下に示すようにグローバル変数に追加OnClickListenerして設定することですEditText

EditText etCurrentEditor;//Global variable

@Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if(v instanceof EditText){
            etCurrentEditor=(EditText)v;
        }
    }

この etCurrentEditor を現在編集中の EditText への参照として使用します

@Override
    public void afterTextChanged(Editable editable) {
        // TODO Auto-generated method stub
        switch (etCurrentEditor.getId()) {
        case R.id.EDITTEXTID:
            break;
        default:
            break;
        }
    }
于 2014-05-12T13:50:33.903 に答える
2

EditText.isFocused()これを達成するためにいくつかの方法を試した後、私はお互いを区別するための正しい方法を見つけました。例えば:

    private class OnTextChangedListener implements TextWatcher {

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (edtName.isFocused()) {
            //do something
        } else if (edtEmail.isFocused()) {
            //do something
        } else if (edtContent.isFocused()) {
             //do something
        }
    }
}
于 2017-10-10T07:42:01.037 に答える
1

TextWatcherはい、を格納するカスタムの複数のインスタンスを使用できますTextView。(TextView実際には を持つクラスですaddTextChangedListener。)

上記の hashCode ソリューションと同様に、 if を確認するだけですgetText()==s。すべてのコントロールを保存するか、findViewById複数回保存する代わりに、コンテンツ ツリーを 1 回スキャンして、CharSequence.

public TextView findTextView(View v, CharSequence s)
{
   TextView tv;
   ViewGroup vg;
   int i, n;

   if (v instanceof TextView)
   {
      tv = (TextView) v;
      if (tv.getText()==s) return(tv);
   }

   else if (v instanceof ViewGroup)
   {
      vg = (ViewGroup) v;
      n = vg.getChildCount();
      for(i=0;i<n;i++)
      {
         tv = findTextView(vg.getChildAt(i), s);
         if (tv!=null) return(tv);
      }
   }

   return(null);
}

public void afterTextChanged(Editable s)
{
   TextView tv=findTextView(findViewById(android.R.id.content), s);
   if (tv==null) return;
   switch(tv.getId())
   {
      case R.id.path:
         break;
      case  R.id.title:
         break;
   }
}

もちろん、 と のfindTextViewbeforeTextChangedで使用することもできますonTextChanged

于 2013-05-12T00:27:40.283 に答える
1

すべての活動のためのグローバルワンクラス。

CustomTextWatcher.java

package org.logicbridge.freshclub.customizedItems;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
    public class CustomTextWatcher implements TextWatcher {
        private EditText mEditText;
        Context context;

        public CustomTextWatcher(EditText e, Context context) {
            mEditText = e;
            this.context = context;
        }

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

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

        public void afterTextChanged(Editable s) {

        }
    }
于 2013-10-15T05:33:45.350 に答える
1

編集テキストのIDを取得するためにこれを行うことができます。テストしていませんが、動作するかどうかを教えてください。

//setting textWatcher for the editText
textWatcher(owner_name);


public void textWatcher(final EditText editText){

    TextWatcher watcher = new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

           if(editText.getId()==R.id.your_id){
             //Do something
           }   
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
          if(editText.getId()==R.id.your_id){
          //Do something
          }
        }

        @Override
        public void afterTextChanged(Editable s) { }
    };

    editText.addTextChangedListener(watcher);
}
于 2018-10-06T14:02:43.387 に答える
0

TextWatcherメソッドへのパラメーターとしていつでも定義addTextChangedListenerできます。このようにして、各編集テキストに対して複数の定義を含めることができます。

于 2014-05-30T07:37:24.337 に答える
0

hashCode()メソッドを使用して、編集テキストと文字列のハッシュコードを比較するだけです

@Override
public void afterTextChanged(Editable s) {

    if (editext.getText().hashCode() == s.hashCode()){
        type1Total(type1List);
    }

}
于 2017-11-23T13:02:05.143 に答える
0

Kotlin を使用している場合は、拡張関数が機能します。たとえば、TextWatcher をeditText1およびに追加する必要があります。editText2

このような拡張関数を作成し、

 fun EditText.addTextWatcher() {
        this.addTextChangedListener(
                object : TextWatcher {
                    override fun afterTextChanged(s: Editable?) {

                    }

                    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

                    }

                    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                        // you do some common operations here

                        when (this@addTextWatcher) {
                            editText1 -> {
                                // do something for editText1
                            }
                            editText2 -> {
                                // do something for editText2
                            }
                        }
                    }
                }
        )
    }

次に、このようにテキストウォッチャーを EditTexts に追加するだけです

editText1.addTextWatcher()
editText2.addTextWatcher()
于 2020-07-16T05:06:15.830 に答える