2011-09-03 7 views
4

Si j'ai raison, il y a un bug qui, lorsque les paramètres régionaux indiquent que le point décimal est une virgule (comme en Allemagne ou en Italie), le keyboad numérique d'Android n'accepte pas les virgules. Il n'accepte que les points. Je dois corriger ce bug dans mon application. Les conditions sont les suivantes:Que fait KeyListener exactement?

  1. Lorsque le focus est réglé sur un EditText, le programme affiche le clavier virtuel en mode symbole/numérique.
  2. Sous les paramètres régionaux européens, le clavier accepte une virgule (et un signe).
  3. Et, # 2 doit être fait par programme.

Je trouve que je peux utiliser XML pour atteindre # 1 et # 2 (althgout ce serait permettre mutiple signes et chiffres après la virgule dans le intput), mais il ne satisfait pas # 3:

android:inputType="numberDecimal|numberSigned" 
android:digits="1234567890,-" 

La documentation indique android:digits peut être achevée en utilisant KeyListener. J'ai donc fait un KeyListener pour autoriser/interdire les caractères. Mais à partir de ce que j'ai vu, peu importe ce que je reviens de onKeyDown(), le caractère d'entrée est toujours autorisé. Je m'attends à KeyListener() me permet de filtrer l'entrée, mais j'ai dû manquer quelque chose. Pourriez-vous le signaler s'il vous plaît? Je vous remercie!

et.setKeyListener(new KeyListener() { 
    @Override public void clearMetaKeyState(View view, Editable content, int states) {} 
    @Override public int getInputType() { return InputType.TYPE_CLASS_NUMBER; } 
    @Override public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) { 
     if ((keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) || 
      keyCode == KeyEvent.KEYCODE_MINUS || 
      keyCode == KeyEvent.KEYCODE_COMMA) { 
      // I want to allow these 
      return false; 
     } 
     // I want to disallow the rest 
     return true; 
    } 
    @Override public boolean onKeyOther(View view, Editable text, KeyEvent event) { return false; } 
    @Override public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) { return false; } 
}); 

P.S: J'ai aussi essayé d'utiliser et.setFilters() et lui donner une coutume InputFilter. Mais il semble que tant que android:inputType="numberDecimal" existe, que j'ai besoin de mettre le clavier en mode numérique/symbole, il ignore mon filtre.

final int decimalPoint = ','; 
InputFilter[] filterArray = new InputFilter[1]; 
filterArray[0] = new InputFilter() { 
    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
    { 
     int dots = 0, i; 
     String s = source.toString(); 
     String d = dest.toString(); 
     boolean hasSign = false; 

     if (source.length() == 0) 
      return null; 

     for (i = 0; i < d.length(); i++) 
      if (d.charAt(i) == '-') 
       hasSign = true; 
      else if (d.charAt(i) == decimalPoint) 
       dots++; 
     for (i = start; i < end && i < s.length(); i++) { 
      if ((s.charAt(i) >= '0' && s.charAt(i) <= '9') || 
       (s.charAt(i) == '-' && !hasSign && i == start && d.length() == 0)) 
       continue; 
      if (s.charAt(i) == decimalPoint && dots == 0) { 
       dots++; 
       continue; 
      } 
      s = s.substring(0, start) + s.substring(start + 1, end); 
      end--; 
     } 
     return s.length() == source.length() ? null : s; 
    }}; 
et.setFilters(filterArray); 
+0

Sans un Keylistener cela fonctionne pour moi. Le fichier XML pour le modifier: \t \t \t \t

Répondre

-2

Tout ce que vous devez savoir sur KeyListener est here

espoir que vous aide.

1

Cela devrait faire l'affaire.

et.setKeyListener(DigitsKeyListener.getInstance("1234567890,-")); 
+4

fonctionne pour le clavier par défaut. Mais le clavier par défaut des appareils Samsung (testé avec S3 sous 4.3) ne montre pas le séparateur décimal après avoir ajouté cet écouteur (également avec "1234567890., -") – Zarokka