2012-01-31 157 views
3

我想篩選EditText的輸入字符只允許有效的浮點值。 (例如:「12,45」,只有一個逗號,...)。安卓:EditText KeyListener不工作

對於這一點,我用的是KeyListener(與onKeyListener或textChangeListener不混淆,我想防止進入無效數據的用戶)。

在Android 2.3.6和3.2 keyListener.filter()和keyListener.getAcceptedChars()不叫,我可以介紹任何字符(不限於.getAcceptedChars())

我發現很少有關單證KeyListener的。如果你有一個很好的例子或文檔,我很感興趣。

任何線索爲什麼這不起作用?

我做錯了什麼?

活動代碼示例:

@Override 

    protected void onCreate(Bundle savedInstanceState) 

    { 

     super.onCreate(...); 

     setContentView(R.layout.editTextTest_lyt); 

... 

mEditTextTest = (EditText) findViewById(R.id.editTextTest); 

mEditTextTest.setKeyListener(new NumberCommaDecimalKeyListenerTest()); 

...} 

佈局代碼示例:

editTextTest_lyt.xml: 
      <EditText 
       android:id="@+id/editTextTest" 
       android:layout_height="fill_parent" 
       android:layout_width="fill_parent" 
       android:layout_weight="1" 
       android:inputType="numberSigned|numberDecimal" 
       android:ems="5" 
       android:maxLength="9" 
       android:maxLines="1" 
       android:gravity="right|center_vertical" 
       android:imeOptions="actionNext"/> 

KeyListener的代碼示例:

public class NumberCommaDecimalKeyListenerTest extends NumberKeyListener { 

private static final char[] mAccepted = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', ',' }; 
    private static final boolean mSign = true; 
    private static final boolean mDecimal = true; 

    @Override 

    protected char[] getAcceptedChars() 
    { 
     Log.e("LODA", "KeylistenerTest.getAcceptedChars()"); // DONT show up in logs 
     return mAccepted; 
    } 

    public NumberCommaDecimalKeyListenerTest() 
    { super(); 
    Log.e("LODA", "CREATE KeylistenerTest"); // show up in logs 
    } 

    @Override 
    public int getInputType() 
    { 
    Log.e("LODA", "KeylistenerTest.getInputType()"); // show up in logs 
     int contentType = InputType.TYPE_CLASS_NUMBER; 
     if (mSign) 
     { 
      contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED; 
     } 
     if (mDecimal) 
     { 
      contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL; 
     } 
     return contentType; 
    } 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
    { 
    Log.e("LODA", "enter KeylistenerTest.filter"); // DONT show up in logs 

     // My logic will go here... 

     // if user pressed '.', is changed for ',' 
     source = source.toString().replace(".", ","); 
     source = source.toString().replace("6", "9"); 

     CharSequence out = super.filter(source, start, end, dest, dstart, dend); 

     return out; 
    } 

} 

回答

6

看着他們的關係狀態,以KeyListener Android的文檔是:

請注意,對於大多數情況下,此接口已被InputMethod定義的軟輸入方法取代了一般 ;它應該只對其中一個應用程序有其自己的屏幕鍵盤的情況下使用 也 要處理硬鍵盤事件

匹配IT和方法getInputType()

如果您返回TYPE_NULL,則不提供軟鍵盤。在其他 單詞中,您必須提供用於屏幕輸入的自定義鍵盤,並且將使用按鍵監聽器處理來自硬鍵盤的輸入。

如果返回任何其他值,當用戶將焦點在編輯器中,這將提供一個鍵盤 也消耗硬按鍵事件軟輸入法將創建 。 這意味着通常不會使用密鑰監聽器 ,而是根據此處返回的內容類型,軟輸入方法將採取 管理密鑰輸入。

因此,因爲您返回的是內容類型,所以忽略KeyListener。看起來這是不可能的,或者你有沒有找到解決辦法?

也許你可以改爲創建一個自定義的TextWatcher,然後使用EditText.addTextChangedListener(TextWatcher textWatcher)在EditText上設置它。

+0

看起來像我想念瞭解keyListener類。 (順便說一句,什麼意思是「一般不使用」?!?)。感謝這個見解。 – Loda 2012-02-01 10:34:50

+0

我認爲這意味着在大多數情況下它不會被使用,除了當getInputType()的返回類型是TYPE_NULL時。 – user1173706 2012-02-01 12:29:35

+0

可能。無論如何,這個類的文檔不是很清楚/完整。我會盡快做一些測試。 – Loda 2012-02-01 14:05:59