2012-01-31 207 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