代码之家  ›  专栏  ›  技术社区  ›  Vikas Patidar

多个EditText的文本观察程序

  •  64
  • Vikas Patidar  · 技术社区  · 14 年前

    我想实施 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 
    }
    

    不过,这是很好的工作,但我正在寻找其他方法,以便我可以明确地识别 编辑文本 字段 SoftKeyboard 是目前的重点。

    14 回复  |  直到 12 年前
        1
  •  89
  •   Community Bayu Bramantya    7 年前

    建议的解决方案 @Sebastian Roth's answer 不是的一个实例 TextWatcher 对一些人来说 EditTexts . 它是一个类,该类的n个实例 编辑文本 .

    每个EditText都有自己的可扩展性。 文本观察程序 的事件有如下可扩展性 s 参数。我检查它们的hashCode(每个对象的唯一Id)。getText()返回该扩展。所以如果 myEditText1.getText().hashCode() 等于 s.hashCode() 意思是 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);
    
        2
  •  83
  •   Bob    12 年前

    我想这样做:

    @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) {
        }
    }
    
        3
  •  12
  •   user3132789    11 年前

    使用“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);
    }
    

    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 
    }
    

    好吧,让我知道你是怎么想的。

        4
  •  11
  •   Tomasz    10 年前

    --编辑--

    如果只想使用afterextchanged compare可编辑文件:

    @Override
    public void afterTextChanged(Editable editable) {
        if (editable == mEditText1.getEditableText()) {
            // DO STH
        } else if (editable == mEditText2.getEditableText()) {
            // DO STH
        }
    }
    
        5
  •  9
  •   Wojtek    7 年前

    我使用这个解决方案:

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

      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));
      
        6
  •  2
  •   Just Variable    10 年前

    还有一个办法是 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;
            }
        }
    
        7
  •  1
  •   Renate    11 年前

    是的,可以使用自定义的多个实例 TextWatcher 那家商店 TextView . ( 文本框 实际上是 addTextChangedListener .)

    类似于上面的hashCode解决方案,您可以检查 getText()==s . 而不是存储所有控件或 findViewById 多次,您只需自己扫描一次内容树,就可以找到具有 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;
       }
    }
    

    当然你也可以用 findTextView 里面 beforeTextChanged onTextChanged .

        8
  •  1
  •   Dharmik    11 年前

    全球一级所有活动。

    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) {
    
            }
        }
    
        9
  •  1
  •   Lakhan Sharma    7 年前

    我的实施方式是:

    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) {
    
    }
    
        10
  •  1
  •   Hien Quang Le    7 年前

    在尝试了几种方法之后,我找到了正确的方法 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
            }
        }
    }
    
        11
  •  1
  •   OhhhThatVarun    6 年前

    你可以这样做来获取编辑文本的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);
    }
    
        12
  •  0
  •   vITs    10 年前

    你总是可以定义 TextWatcher 作为参数 addTextChangedListener 方法。这样,每个编辑文本都可以有多个定义。

        13
  •  0
  •   saigopi.me    7 年前

    只需使用 哈希代码() 方法

    @Override
    public void afterTextChanged(Editable s) {
    
        if (editext.getText().hashCode() == s.hashCode()){
            type1Total(type1List);
        }
    
    }
    
        14
  •  0
  •   user6897800    7 年前

    这就是我所做的。。。

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

    然后将TextWatcher添加到onCreate方法中的每个EditText&默认情况下,这里也保持按钮setEnabled(false)。

    button.setEnabled(false); 
    
        editText1.addTextChangedListener(textWatcher);
        editText2.addTextChangedListener(textWatcher);
        editText3.addTextChangedListener(textWatcher);