No se puede implementar textwatcher correctamente en android

Hola chicos yo estaba buscando una manera de averiguar lo que el usuario estaba escribiendo en un EditText y me tropecé con el TextWatcher . El problema es que no entiendo a qué se refieren los parámetros en la función. Quiero realizar un seguimiento del texto introducido por el usuario carta por letra. No puedo averiguar qué argumento es el subíndice correcto no. He intentado variaciones diferentes pero no he tenido ninguna suerte con ésos. Básicamente, quiero guardar el texto ingresado en una matriz hasta que el usuario presione el botón ',' o exceda el límite de 24 caracteres. Por favor avise.

 public class Main extends Activity implements OnClickListener { // inputans.setOnKeyListener(this); Button go; TextView answer; TextView check; EditText inputans, inputq; boolean done1 = false; char[] ans = new char[30]; String predef = "Please answer my question"; char[] predefc = predef.toCharArray(); int len = predefc.length; int i = 0; char[] substring = new char[30]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialisevars(); go.setEnabled(false); go.setOnClickListener(this); inputans.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if ((count - before) > 0) { char current = s.charAt(before); if (current == '.' || i >= 24) { // 24 check // ans[i]='\0'; // inputans.setText(predef, // TextView.BufferType.EDITABLE); check.setText(predef); go.setEnabled(true); } else { ans[i] = current; i++; // char[] substring = char[30]; back button // problem,check if prev length - current length // >0 int m; for (m = 0; m <= i; m++) { substring[m] = predefc[m]; } check.setText(substring.toString()); // substring[m]='\0'; /* * inputans.setText(substring.toString(), * TextView.BufferType.EDITABLE); */ } } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } }); } private void initialisevars() { // TODO Auto-generated method stub go = (Button) findViewById(R.id.bGo); answer = (TextView) findViewById(R.id.tvAns); inputans = (EditText) findViewById(R.id.etTricky); inputq = (EditText) findViewById(R.id.etQues); check = (TextView) findViewById(R.id.textView1); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.bGo: { answer.setText(ans.toString()); } break; } } } 

En la documentación de Android, puede leer:

public abstract void onTextChanged (CharSequence s, int inicio, int antes, int count) Añadido en el nivel 1 de la API

Este método se llama para notificarle que, dentro de s , los caracteres de count que comienzan en el start han reemplazado el texto antiguo que tenía longitud before . Es un error intentar realizar cambios en s desde esta devolución de llamada.

Esto significa que:

  • s ya es un texto modificado (se puede obtener su longitud, por s.length() )
  • count es el número de caracteres que se han agregado
  • start es la posición en la que se han añadido nuevos caracteres
  • before es la longitud del texto antes de los cambios

Básicamente para lograr lo que quieres, prefiero ir con este enfoque en lugar de arrays:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialisevars(); go.setEnabled(false); go.setOnClickListener(this); inputans.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if ((s.length() - before) > 0) { // Check if text is longer than before changing char current = s.charAt(before); if (current == '.' || s.length() >= 24) { check.setText(predef); go.setEnabled(true); } else { check.setText(s); } } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } }); } 

Simple como eso.

beforeTextChanged() se llama antes de que ocurra cualquier cambio, aquí se puede obtener el contenido antiguo, que sólo va a cambiar:

 public void beforeTextChanged(CharSequence s, int start, int count, int after) { String toBeChanged = s.subSequence(start,start+count).toString(); } 

Para obtener lo que reemplazó el contenido anterior, use onTextChanged() , esto se llama justo cuando se realiza el reemplazo:

 public void onTextChanged(CharSequence s, int start, int before, int count) { String replacement = s.subSequence(start,start+count).toString(); } 

Si no está interesado en lo que está cambiando y sólo quiere saber algo cambiado , sólo con el propósito de guardarlo, o compararlo, o validarlo etc etc, puede utilizar el tercer método afterTextChanged() . Este método se utilizará cuando no desee interferir con la edición por parte del usuario de uno o más caracteres:

 public void afterTextChanged(Editable s) { String newString = s.toString(); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.