J'ai un TextWatcher défini sur un EditText qui modifie le type d'entrée après qu'un utilisateur tape un nombre suivi d'un espace. Si l'utilisateur tape deux nombres, le type d'entrée bascule et accepte le caractère suivant, mais si l'utilisateur tape un seul chiffre et appuie sur l'espace, le type d'entrée change mais n'accepte pas le premier caractère que l'utilisateur essaie d'entrer .Le clavier n'accepte pas le premier caractère lors du changement d'entrée
J'ai testé ça sur Froyo et 1.6, ça n'arrive que sur Froyo, 1.6 fonctionne comme il se doit.
Voici le code:
TextWatcher watcher = new TextWatcher() {
@Override
public void afterTextChanged (Editable s) {
}
@Override
public void beforeTextChanged (CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged (CharSequence s, int start, int before, int count) {
// Parsed text holder is a class that just parses the EditText and pulls out various parts.
ParsedTextHolder th = parseTextHolder(s);
String newText = "";
Boolean setTextKeyListener = false;
String tGetTextString = mQuery.getText().toString();
if (!th.pFullMatch.equals("")) {
if (th.pFullMatch.length() == 2) {
mQuery.setKeyListener(new
TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true));
newText = tGetTextString + " for ";
setTextKeyListener = true;
}
}
if (setTextKeyListener) {
Log.i("setTextKeyListener", "true");
if (mQuery.getKeyListener().getClass() != TextKeyListener.class) {
mQuery.setKeyListener(new TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true));
} else {
Log.d("setTextKeyListener", "skipped. already was text.");
}
if (!newText.equals("")) {
int position = newText.length();
String ttext = newText;
newText = "";
mQuery.setText(ttext, TextView.BufferType.EDITABLE);
mQuery.setText(ttext);
Editable text = mQuery.getEditableText();
Log.w("setting selectiont to text: ", text.toString());
Log.w("setting selectiont to position: ", Integer.toString(position));
Selection.setSelection(text, position);
mQuery.setKeyListener(new TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true));
}
}
}
};
De plus, voici un APK si vous voulez voir ce que le bug est comme: http://endlesswhileloop.com/files/KeyboardBug.apk
Juste essayé en utilisant afterTextChanged, pas de chance. Merci pour la réponse cependant, je n'ai pas réalisé qu'il était mauvais d'éditer l'EditText dans onTextChanged. – tonyc
Hmm, d'accord, pourquoi appelez-vous refreshDrawableState à la fin? Cela semble un peu hackish, peut-être causer des différences dans différentes versions .. (Ceci est juste une supposition, mais souvent, lorsque vous devez forcer l'affichage à rafraîchir, vous masquer juste un problème sous-jacent). –
Ah, j'avais refreshDrawableState juste comme un hack pour voir si ça le réparerait, j'ai enlevé un tas de choses non pertinentes, mais toujours pas de chance. – tonyc