TextWatcher用于多个EditText

Vik*_*dar 65 android interface textwatcher android-edittext android-activity

我想TextWatcher为多个EditText字段实现接口.目前我正在使用:

text1.addTextChangedListener(this);
text2.addTextChangedListener(this);
Run Code Online (Sandbox Code Playgroud)

然后重写我的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 
}
Run Code Online (Sandbox Code Playgroud)

然而,这工作正常但我正在寻找其他方法,以便我可以明确地确定当前关注的EditText字段SoftKeyboard.

Bob*_*obs 89

在建议的解决方案@Sebastian罗斯的回答是没有的一个实例TextWatcher一些EditTexts.对于n,它是该类的一个类和n个实例EditTexts.

每个EditText都有自己的Spannable.TextWatcher的事件将此Spannable作为s参数.我检查他们的hashCode(每个对象的唯一ID).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);
        }
    }

};
Run Code Online (Sandbox Code Playgroud)

myEditText1.addTextChangedListener(generalTextWatcher);
myEditText2.addTextChangedListener(generalTextWatcher);
Run Code Online (Sandbox Code Playgroud)

  • @SebastianRoth每个EditText都有自己的Spannable.`TextWatcher`事件将此Spannable作为`CharSequence`或`Editable`参数.我没有检查EditTexts的Text值.我检查他们的hashCode(每个对象的唯一ID).`myEditText1.getText()`返回`Spannable`而不是Text值.所以如果`myEditText1.getText().hashCode()`等于`s.hashCode()`意味着s属于`myEditText1` (14认同)
  • 您是否仔细检查过此解决方案?如果用户在两个输入字段中输入相同的文本会怎样? (3认同)
  • 你是对的,非常好.谢谢你的加入! (3认同)

Seb*_*oth 83

我会这样做:

@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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不是"单个TextWatcher用于多个EditTexts".它是一个TextWatcher类的3个实例.所以3个独立的TextWatchers控制着3个EditTexts. (10认同)
  • 有趣的想法,但这意味着每个EditText都有一个单独的文本观察器. (6认同)

小智 12

使用"CustomTextWatcher"的想法,我做到了

1)创建一个新的TextWatcherListener接口:

public interface TextWatcherExtendedListener extends NoCopySpan
{
    public void afterTextChanged(View v, Editable s);

    public void onTextChanged(View v, CharSequence s, int start, int before, int count);

    public void beforeTextChanged(View v, CharSequence s, int start, int count, int after);
}
Run Code Online (Sandbox Code Playgroud)

2)创建并使用EditTextExtended而不是EditText(在我的例子中):

public class EditTextExtended extends EditText
{
   private TextWatcherExtendedListener  mListeners = null;

   public EditTextExtended(Context context) 
   {
     super(context);
   }

   public EditTextExtended(Context context, AttributeSet attrs)
   {
      super(context, attrs);
   }

   public EditTextExtended(Context context, AttributeSet attrs, int defStyle)
   {
        super(context, attrs, defStyle);
   }

   public void addTextChangedListener(TextWatcherExtendedListener watcher) 
   {    
       if (mListeners == null) 
       {
           mListeners = watcher;
       }
   }

   public void removeTextChangedListener(TextWatcherExtendedListener watcher) 
   {
       if (mListeners != null) 
       {
           mListeners = null;        
       }
   }

   void  sendBeforeTextChanged(CharSequence text, int start, int before, int after)
   {
       if (mListeners != null) 
       {
           mListeners.beforeTextChanged(this, text, start, before, after);
       }
   }

   void  sendOnTextChanged(CharSequence text, int start, int before,int after) 
   {
       if (mListeners != null) 
       {
           mListeners.onTextChanged(this, text, start, before, after);
       }
   }

   void  sendAfterTextChanged(Editable text) 
   {
       if (mListeners != null)
       {
           mListeners.afterTextChanged(this, text);
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

3)所以,你需要写下这段代码:

myEditTextExtended.addTextChangedListener(this) //Let implement TextWatcherExtendedListener methods
Run Code Online (Sandbox Code Playgroud)

4)使用它们:

@Override
public void onTextChanged(View v, CharSequence s, int start, int before, int count) 
{
   //Tested and works
   //do your stuff  
}


@Override
public void beforeTextChanged(View v, CharSequence s, int start, int count, int after)
{   
     //not yet tested but it should work    
}

@Override
public void afterTextChanged(View v, Editable s) 
{
    //not yet tested but it should work 
}
Run Code Online (Sandbox Code Playgroud)

好吧,让我知道你的想法.


Tom*_*asz 11

- 编辑 -

如果您只想使用afterTextChanged比较editables:

@Override
public void afterTextChanged(Editable editable) {
    if (editable == mEditText1.getEditableText()) {
        // DO STH
    } else if (editable == mEditText2.getEditableText()) {
        // DO STH
    }
}
Run Code Online (Sandbox Code Playgroud)


Woj*_*tek 9

我使用这个解决方案:

  • 添加返回侦听器的方法:

    private TextWatcher getTextWatcher(final EditText editText) {
        return new 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) {
                // do what you want with your EditText
                editText.setText("blabla");
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
            }
        };
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 将监听器添加到多个EditText,您还可以传递其他参数:

    editText1.addTextChangedListener(getTextWatcher(editText1));
    editText2.addTextChangedListener(getTextWatcher(editText2));
    editText3.addTextChangedListener(getTextWatcher(editText3));
    
    Run Code Online (Sandbox Code Playgroud)