50

我想为多个EditText字段实现TextWatcher接口。目前我使用:用于多个EditText的TextWatcher

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 
} 

然而,这是工作的罚款,但我在寻找其他途径,这样我可以明确地识别出其中EditTextSoftKeyboard目前专注。

+1

的可能的复制[如何使用单TextWatcher多个EditTexts?](http://stackoverflow.com/questions/5702771/how-to-use-single-textwatcher-for-multiple-edittexts) – 2015-10-27 04:04:37

+1

@SkyKelsey你写的答案实际上是创建TextWatcher的多个实例,因此我认为这不是OP提出的问题的完美答案,关于我的问题是关于在TextWatcher接口方法中识别每个EditText。 – 2015-10-29 12:48:26

+0

https://github.com/henrychuangtw/AutoInsertEditText – HenryChuang 2017-01-18 02:12:12

回答

66

@Sebastian Roth's answer建议的解决方案是不是有些EditTextsTextWatcher一个实例。它是一个类和n个该类的实例,编号为EditTexts

每个EditText都有自己的Spannable。 TextWatcher的事件具有此Spannable作为s参数。我检查他们的hashCode(每个对象的唯一标识)。 myEditText1.getText()返回Spannable。因此,如果myEditText1.getText().hashCode()s.hashCode()等于这意味着,如果你想拥有的TextWatcher一个实例一些EditTexts你应该使用这个是s属于myEditText1

所以:

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); 
75

我会做这样的:

@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) { 
    } 
} 
+4

有趣的想法,但这意味着你有一个单独的文本观察每个EditText。 – ArtOfWarfare 2012-12-03 19:41:30

+10

这个答案不是`多个EditTexts的Single TextWatcher`。它是一个TextWatcher类的3个实例。所以3个独立的TextWatcher控制3个EditTexts。 – breceivemail 2012-12-08 12:07:45

+1

@breceivemail,一个类,3个实例。同意人们不指定他们的对象类型时很难。他的目标是只编写一次代码,所以它就是这样。 – SparK 2013-10-24 13:23:41

1

是的,您可以使用存储TextView的多个自定义TextWatcher实例。 (TextView实际上是有addTextChangedListener类。)

到的hashCode解决类似上面你可以只检查是否getText()==s。 您可以简单地为拥有CharSequence的控件扫描一次内容树,而不是存储所有控件或findViewById多次。

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; 
    } 
} 

当然你也可以使用findTextViewbeforeTextChangedonTextChanged

1

全球一个类的所有活动。

CustomTextWatcher。Java中使用 “CustomTextWatcher” 的想法

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) { 

     } 
    } 
11

,我做到了

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); 
} 

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); 
     } 
    } 
} 

3)所以,你需要写这个代码的地方:

myEditTextExtended.addTextChangedListener(this) //Let implement TextWatcherExtendedListener methods 

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 
} 

好了,让我知道你怎么想。

2

另一种方式解决方法是增加OnClickListenerEditText,并设置一个全局变量低于

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; 
     } 
    } 
0

你总是可以定义一个参考TextWatcher作为addTextChangedListener方法的参数。这样,​​您可以为每个编辑文本设定多个定义。

8

- 编辑 -

如果只想使用afterTextChanged比较editables:

@Override 
public void afterTextChanged(Editable editable) { 
    if (editable == mEditText1.getEditableText()) { 
     // DO STH 
    } else if (editable == mEditText2.getEditableText()) { 
     // DO STH 
    } 
} 
1

我实现它:

edittext1.addTextChangedListener(this); 
edittext2.addTextChangedListener(this); 
edittext3.addTextChangedListener(this); 

和:

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

} 

@Override 
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
    if(edittext1.hasFocus()){ 
     //text changed for edittext1 
    }else if(edittext2.hasFocus()){ 
     //text changed for edittext2 
    }else { 
     //text changed for edittext3 
    } 
} 

@Override 
public void afterTextChanged(Editable editable) { 

} 
3

我用这个解决方案:

  • 返回监听器添加方法:

    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) { 
    
         } 
        }; 
    } 
    
  • 添加监听到多个EditText上的,你也可以通过其他参数:

    editText1.addTextChangedListener(getTextWatcher(editText1)); 
    editText2.addTextChangedListener(getTextWatcher(editText2)); 
    editText3.addTextChangedListener(getTextWatcher(editText3)); 
    
1

尝试几种方法来实现这一点,我找到正确的方式使用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 
     } 
    } 
} 
0

只是比较的EditText和字符串的哈希码一样使用的hashCode()方法

@Override 
public void afterTextChanged(Editable s) { 

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

} 
0

这是我做了什么......

private TextWatcher textWatcher = new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

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

     if (editText1.getText().length() > 0 
       && editText2.getText().length() > 0 
       && editText3.getText().length() > 0) { 

      button.setEnabled(true); 
     } else { 

      button.setEnabled(false); 
     } 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 

    } 

然后在onCreate方法&中将TextWatcher添加到每个EditText中,默认情况下此处还保留了setEnabled(false)按钮。

button.setEnabled(false); 

    editText1.addTextChangedListener(textWatcher); 
    editText2.addTextChangedListener(textWatcher); 
    editText3.addTextChangedListener(textWatcher); 
相关问题