2010-09-13 5 views
0

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

Répondre

0

est-mquery la editText qui est surveillé? Selon le javadocs, vous ne devez apporter aucune modification au texte de votre EditText au onTextChanged. Toutes ces modifications doivent être effectuées au afterTextChanged.

Généralement, j'ai fini par examiner la modification dans onTextChanged et ensuite faire le travail qui résulte du changement dans afterTextChanged. Vous pourriez essayer ça.

+0

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

+0

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). –

+0

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

Questions connexes