android edittext onchange listener

Sé un poco sobre TextWatcher pero eso se dispara en cada personaje que ingresas. Quiero un oyente que se active siempre que el usuario termine de editar. ¿Es posible? También en TextWatcher obtengo una instancia de Editable pero necesito una instancia de EditText . ¿Cómo lo consigo?

EDITAR : la segunda pregunta es más importante. Por favor responde eso.

En primer lugar, puede ver si el usuario terminó de editar el texto si EditText pierde el foco o si el usuario presiona el botón listo (esto depende de su implementación y de lo que sea mejor para usted). En segundo lugar, no puede obtener una instancia de EditText dentro de TextWatcher solo si ha declarado EditText como un objeto de instancia. Aunque no debe editar EditText en TextWatcher porque no es seguro.

EDITAR:

Para poder obtener la instancia de EditText en su implementación de TextWatcher , debe intentar algo como esto:

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

Tenga en cuenta que la muestra anterior puede tener algunos errores, pero solo quería mostrar un ejemplo.

Cualquiera que use ButterKnife . Puedes usar como:

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

Me molestaba que la implementación de un oyente para todos mis campos EditText requiriera que tuviera un código feo y detallado, así que escribí la siguiente clase. Puede ser útil para cualquiera que tropiece con esto.

 public abstract class TextChangedListener 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); } 

Ahora implementar un oyente es un poco más limpio.

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

En cuanto a la frecuencia con la que se dispara, uno podría implementar un control para ejecutar su código deseado en //Do stuff después de un determinado

Lo he hecho 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()); } }); 

TextWatcher no funcionó para mí, ya que siguió disparando para cada EditText y arruinando los valores de los demás.

Aquí está mi solución:

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

Por lo tanto, mediante el método getChildAt(xx) puede recuperar cualquier elemento en el ListView y obtener el elemento individual utilizando findViewById . Y luego dará el valor más reciente.

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

Por lo que puedo pensar sobre eso, solo hay dos formas en que puedes hacerlo. ¿Cómo puedes saber que el usuario ha terminado de escribir una palabra? Ya sea en el enfoque perdido o haciendo clic en un botón “Aceptar”. No hay forma de que pueda saber que el usuario presionó el último caracter …

Así que llame a onFocusChange(View v, boolean hasFocus) o agregue un botón y un escucha de clic en él.