TextWatcher.afterTextChanged tiene cadena incorrecta después de retroceso

Estoy usando un TextWatcher para escuchar entradas clave. Cuando el usuario escribe '@', abro una listactividad y el usuario tiene que elegir en la lista. Una vez elegido, coloco el texto del elemento seleccionado (incluyendo el @ inicial) en el editext y la edición normal continúa.

El problema es que cuando presiono backspace, la cadena que recibo en aftertextchanged evento está mal, y la listactivity de nuevo aparece.

editText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { String str = s.toString(); if (str.length() > 0) { if (str.substring(str.length() - 1).equals("@")) { Intent i = new Intent(MessageComposeActivity.this, MembersListActivity.class); startActivityForResult(i, Util.MEMBERS_LIST); } } } }); 

Y en onActivityResult:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Util.MEMBERS_LIST) if (resultCode == RESULT_OK) { editText.setText(editText.getText().toString() + data.getExtras().get("screenname") + " "); editText.setSelection(editText.getText().length()); } } 

Por ejemplo:

En EditText escribo '@', y la actividad aparece y elijo 'James'. El EditText ahora muestra @James. Si vuelvo a pulsar una vez o dos veces, la listaactividad vuelve a aparecer mientras el EditText muestra @Jam.

PS: El afterTextChanged () se llama dos veces a veces para un backspace (o cualquier clave), en la segunda ejecución de afterTextChanged () me sale la cadena de entrada mal. En la primera ejecución de afterTextChanged () recibo @Jam, y en la segunda ejecución obtengo '@' por lo tanto aparecectivity aparece.

Pregunta: ¿Por qué afterTextChanged () se llama dos veces, Y por qué en la segunda ejecución me sale el texto equivocado?

Muchas gracias.

Tuve el mismo problema. No sé cuáles son las causas de la devolución de llamada falsa adicional con una longitud 0 Editable / CharacterSequence.

Yo estaba buscando cambios en un EditText que en realidad dio lugar a un EditText vacío. Terminé teniendo que implementar un Handler para comprobar la longitud de EditText después de 500 ms. Usted puede ser que tenga que hacer su edittext estático o final. Debe ser algo como esto:

  final Handler handler =new Handler(); final Runnable r = new Runnable(){ @Override public void run() { // String str = editText.getText().toString(); if (str.length() > 0) { if (str.substring(str.length() - 1).equals("@")) { Intent i = new Intent(MessageComposeActivity.this, MembersListActivity.class); startActivityForResult(i, Util.MEMBERS_LIST); } } } } ; editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void afterTextChanged(Editable s) { handler.postDelayed(r,500); } }); 
  • Android utiliza el observador de texto para evitar escribir caracteres especiales
  • TextWatcher para más de un EditText
  • Formato de la fecha de caducidad en formato mm / aa
  • Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged
  • Formatear el número de teléfono de EditText como tipos de usuario
  • EditText no se actualiza después de que se cambió el texto en TextWatcher
  • Android Manejo de muchos campos de EditText en un ListView
  • Clickable compuesto drawable en EditText que hace estallar una vista en tecleo
  • Cómo sólo permitir números positivos en un EditText
  • ¿Cómo utilizar Single TextWatcher para múltiples EditTexts?
  • Cómo dar formato a la entrada de EditText al escribir con separadores de miles (,) en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.