TextWatcher per più di un EditText

Voglio implementare l'interface TextWatcher per più campi EditText . Attualmente sto usando:

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

quindi sovrascrivendo i methods nella mia attività:

  • Distriggers il click sul trackball in Android
  • Errore sulla generazione di potenza di genimozione
  • Orientamento dell'image dall'intento della galleria / camera
  • Gif non animato in listview personalizzato
  • Dove posso inserire la cartella 'asset' in Android Studio?
  • Cattura audio inviata al server di riconoscimento vocale di Google
  •  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 } 

    Tuttavia questo funziona bene ma sto cercando altri modi in modo da poter identificare esplicitamente quello in cui il field EditText è attualmente concentrato sulla SoftKeyboard .

  • Come forzare un IntentService per arrestarsi immediatamente con un button di annullamento da un'attività?
  • Utilizzo di SQLite da libGDX su Android
  • La spia si spegne mentre si cambia l'orientamento
  • menu di popup di ancoraggio sopra il button di overflow
  • Come colbind Android con il database Oracle?
  • Come implementare la barra di ricerca come applicazione gmail in android?
  • 10 Solutions collect form web for “TextWatcher per più di un EditText”

    La soluzione suggerita nella risposta di @Sebastian Roth non è un'istanza di TextWatcher per alcuni EditTexts . È una class e n istanze di quella class per n EditTexts .

    Ogni EditText ha il suo proprio Spannable. TextWatcher events di TextWatcher hanno questo parametro Spannable come s . Controllo il loro hashCode (ID unico di each object). myEditText1.getText () restituisce Spannable. Quindi se il myEditText1.getText().hashCode() uguale a s.hashCode() significa che s appartiene a myEditText1

    Quindi, se si desidera avere un'istanza di TextWatcher per alcuni EditTexts è necessario utilizzare questo:

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

    e

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

    Vorrei fare questo:

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

    utilizzando l'idea di "CustomTextWatcher", l'ho fatto

    1) È stata creata una nuova interface 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) Creato ed usato EditTextExtended invece di EditText (nel mio caso):

     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) Così, where devi scrivere questo codice:

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

    4) usarli:

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

    Beh, dimmi cosa ne pensi.

    –EDIT–

    Se si desidera utilizzare solo dopoTextChanged confronta gli elementi editabili:

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

    Io uso questa soluzione:

    • Aggiungere il metodo che restituisce l'ascoltatore:

       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) { } }; } 
    • Aggiungere listener a più EditText, puoi anche passare altri parametri:

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

    Un ulteriore modo è aggiungere OnClickListener a EditText e impostare una variabile globale come indicato di seguito

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

    Utilizzare questo etCurrentEditor come riferimento a EditText attualmente modificato

     @Override public void afterTextChanged(Editable editable) { // TODO Auto-generated method stub switch (etCurrentEditor.getId()) { case R.id.EDITTEXTID: break; default: break; } } 

    Sì, puoi utilizzare istanze multiple di un TextWatcher personalizzato che memorizza il TextView . ( TextView è in realtà la class che ha addTextChangedListener .)

    Simile alla soluzione di hashCode sopra puoi controllare se getText()==s . Invece di memorizzare tutti i controlli o findViewById più volte, è ansible semplicemente eseguire la scansione dell'tree dei contenuti una volta per il controllo che ha la 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; } } 

    Naturalmente si potrebbe anche utilizzare findTextView all'interno di beforeTextChanged e onTextChanged .

    Global One per tutte le attività.

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

    Ho implementato come:

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

    e:

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

    Puoi sempre definire TextWatcher come parametro per addTextChangedListener metodo addTextChangedListener questo modo puoi avere più definizioni per each text di modifica.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.