ontextchanged - textwatcher android ejemplo
android edittext onchange listener (7)
Cualquiera que use ButterKnife . Puedes usar como:
@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {
}
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.
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());
}
});
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<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);
}
Ahora implementar un oyente es un poco más limpio.
editText.addTextChangedListener(new TextChangedListener<EditText>(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
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.
en primer lugar, puede ver si el usuario finalizó la edición del texto si EditText
pierde el foco o si el usuario presiona el botón de finalización (esto depende de su implementación y de qué le conviene). En segundo lugar, no puede obtener una instancia de EditText
dentro del textwatcher solo si ha declarado EditText
como un objeto de instancia. Aunque no debe editar EditText
en el textwatcher
porque no es seguro.
EDITAR:
Para poder obtener la instancia de EditText en su implementación de TextWatcher, debería 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.
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);
}
});