2012-06-21 23 views
79

So un po 'di TextWatcher ma che spara ad ogni personaggio che inserisci. Voglio un ascoltatore che si attiva ogni volta che l'utente termina la modifica. È possibile? Anche in TextWatcher ottengo un'istanza di Editable ma ho bisogno di un'istanza di EditText. Come ottengo quello?android edittext onchange listener

MODIFICA: la seconda domanda è più importante. Per favore risponda.

+1

aggiungere l'ascoltatore messa a fuoco, quando l'EditText distogliere l'attenzione , ciò significa che l'utente ha iniziato a modificarlo e quando editText perde lo stato attivo, significa che la modifica è terminata – Houcine

+0

https://github.com/henrychuangtw/AutoInsertEditText – HenryChuang

risposta

156

Per prima cosa, è possibile vedere se l'utente ha terminato di modificare il testo se lo EditText perde lo stato attivo o se l'utente preme il pulsante Fine (ciò dipende dall'implementazione e da ciò che si adatta al meglio per voi). In secondo luogo, non è possibile ottenere un'istanza EditText all'interno del visualizzatore di testo solo se è stato dichiarato EditText come oggetto istanza. Anche se non è necessario modificare lo all'interno dello textwatcher perché non è sicuro.

EDIT:

Per essere in grado di ottenere l'istanza EditText nella vostra implementazione TextWatcher si dovrebbe provare qualcosa di simile:

public class YourClass extends Activity { 

private EditText yourEditText; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     yourEditText = (EditText) findViewById(R.id.yourEditTextId); 

     yourEditText.addTextChangedListener(new TextWatcher() { 

      public void afterTextChanged(Editable s) { 

      // you can call or do what you want with your EditText here 
      yourEditText. ... 

      } 

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

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

} 

notare che l'esempio di cui sopra potrebbe avere alcuni errori, ma volevo solo mostraci un esempio

1

Per quanto posso pensarci, ci sono solo due modi per farlo. Come puoi sapere che l'utente ha finito di scrivere una parola? O su fuoco perso, o cliccando su un pulsante "ok". Nella mia mente non si può sapere se l'utente ha premuto l'ultimo carattere ...

Quindi chiamare onFocusChange(View v, boolean hasFocus) o aggiungere un pulsante e un listener di clic ad esso.

2

TextWatcher non ha funzionato per me in quanto ha continuato a sparare per ogni EditText e incasinare i valori degli altri.

Ecco la mia soluzione:

public class ConsultantTSView extends Activity { 
    ..... 

    //Submit is called when I push submit button. 
    //I wanted to retrieve all EditText(tsHours) values in my HoursList 

    public void submit(View view){ 

     ListView TSDateListView = (ListView) findViewById(R.id.hoursList); 
     String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString(); 
    } 
} 

Quindi utilizzando il metodo getChildAt(xx) è possibile recuperare qualsiasi elemento della ListView e ottenere il singolo elemento utilizzando findViewById. E darà quindi il valore più recente.

4

l'ho fatto usando AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview); 
textView.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
     seq = cs; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) { 

    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
     new SearchTask().execute(seq.toString().trim()); 
    } 

}); 
8

Chiunque utilizzi butterknife. È possibile utilizzare come:

@OnTextChanged(R.id.zip_code) 
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) { 

} 
7

Mi dava fastidio che l'implementazione di un ascoltatore per tutti i miei campi EditText necessaria me avere brutto, il codice verbose così ho scritto la classe di seguito. Può essere utile a chiunque inciampa su questo.

public abstract class TextChangedListener<T> implements TextWatcher { 
    private T target; 

    public TextChangedListener(T target) { 
     this.target = target; 
    } 

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

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

    @Override 
    public void afterTextChanged(Editable s) { 
     this.onTextChanged(target, s); 
    } 

    public abstract void onTextChanged(T target, Editable s); 
} 

Ora l'implementazione di un listener è un po 'più pulita.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) { 
      @Override 
      public void onTextChanged(EditText target, Editable s) { 
       //Do stuff 
      } 
     }); 

Per quanto riguarda la frequenza con cui si spara, si potrebbe forse implementare un controllo per eseguire il proprio codice desiderato in //Do stuff dopo un dato una prova

2
myTextBox.addTextChangedListener(new TextWatcher() { 

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

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox); 
    myOutputBox.setText(s); 

    } 
}); 
+2

Ne esiste uno inutile} alla fine – Howard