samsung - teclado corrector ortografico android
TextWatcher onTextChanged no funciona con el teclado automático de autocompletar/palabras sugeridas (1)
Es mejor optar por el método afterTextChanged.
En la siguiente muestra, el texto ingresado se recupera y maneja usando un controlador para el proceso posterior
EditText text1;
StringBuffer previousChar=new StringBuffer();
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
text1=(EditText)findViewById(R.id.editText);
text1.addTextChangedListener(new TextWatcher() {
@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) {
if(!previousChar.toString().equals(s.toString())){
Message msg=new Message();
msg.obj=s.toString();
localHandler.sendMessage(msg);
previousChar=new StringBuffer(s.toString());
Log.i("TAG", "TextEntered = "+s);
}
}
});}
Y en el controlador
private Handler localHandler = new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
String value=(String)msg.obj;
//Your logic with the text entered that is retrieved
}
};
Estoy implementando un TextWatcher en un EditText para buscar y subrayar una serie de palabras clave dentro del texto cada vez que el usuario ingresa un nuevo carácter. Sin embargo, cuando se selecciona una palabra sugerida / autocompletar en el teclado virtual, en lugar de agregar la palabra sugerida a Edittext y luego llamar a la función onTextChanged, se elimina la mitad de la palabra completa. Lo encontré bastante extraño ya que ingresar caracteres individuales activa la función onTextChanged muy bien. Cualquier ayuda sería muy apreciada.
PD. si alguien conoce una mejor manera de procesar un EditText sobre la marcha por favor hágamelo saber.
Código:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_codify_test);
final EditText editText = (EditText) findViewById(R.id.editText_codifyTest);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!checked) { //stop infinite loop
checked = true;
cursorPosition = editText.getSelectionStart(); //get cursor position before text modification
codifyText(editText);
} else {
checked = false;
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
//Find and underline keywords
private void codifyText(EditText editText) {
String plainText = editText.getText().toString() + " ";
int prevWhiteSpace = 0;
final Context context = this;
SpannableString codifiedText = new SpannableString(plainText.substring(0, plainText.length() - 1));
if (codifiedText.length() == 0) return;
for (int i = 0; i < plainText.length(); i ++){
if (Character.isWhitespace(plainText.charAt(i))){
String currWord = plainText.substring(prevWhiteSpace, i);
if (isKeyWordInDataBase(currWord)) {
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
}
};
codifiedText.setSpan(clickableSpan, prevWhiteSpace, i, 0);
}
prevWhiteSpace = i + 1;
}
}
editText.setMovementMethod(LinkMovementMethod.getInstance());
editText.setText(codifiedText, TextView.BufferType.SPANNABLE);
editText.setSelection(cursorPosition); //set cursor to position prior to edit
}