2011-09-03 132 views
4

如果我是對的,當語言環境表示小數點是逗號(如德國或意大利)時,會出現一個錯誤,Android的數字鍵盤不接受輸入逗號。它仍然只接受點。我必須在我的應用程序中修復這個錯誤。要求如下:KeyListener究竟做了什麼?

  1. 將焦點設置爲EditText時,程序將以符號/數字模式顯示軟鍵盤。
  2. 在歐洲語言環境下,鍵盤接受逗號(和符號)。
  3. 而#2必須以編程方式完成。

我發現我可以用XML來實現#1和#2(althgout它會允許在intput多發的跡象和小數點),但它並不滿足#3:

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

文檔說android:digits可以通過使用KeyListener進行驗證。所以我做了一個KeyListener來允許/禁止字符。但從我所看到的,無論我從onKeyDown()返回什麼,都始終允許輸入字符。我期望KeyListener()允許我過濾輸入,但我一定錯過了一些東西。你能指出一下嗎?謝謝!

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:我也嘗試過使用et.setFilters(),並給它一個自定義InputFilter。但似乎只要android:inputType="numberDecimal"存在,我需要將鍵盤設置爲數字/符號模式,它會忽略我的過濾器。你需要了解的KeyListener

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

沒有Keylistener它適合我。用於編輯XML文件:\t <的EditText機器人:位數= 「1234567890,.-」 機器人:layout_width = 「match_parent」 \t \t機器人:layout_height = 「WRAP_CONTENT」 機器人:ID = 「@ + ID/editText1」 \t \t安卓的inputType = 「numberDecimal | numberSigned」> \t \t \t –

回答

-2

一切都是here

希望有所幫助你。

1

這應該可以做到。

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

是否爲默認的鍵盤工作。但是三星設備的默認鍵盤(用S3運行4.3測試)在添加該監聽器後失敗以顯示小數點分隔符(也用「1234567890。, - 」) – Zarokka