我试图过滤edittext的输入字符,使其只允许有效的浮点值。(例如:“12,45”,只有一个逗号,…)。
为此,我使用KeyListener(不要与onkeylister或textchangelister混淆。我想防止用户输入无效数据)。
在Android2.3.6和3.2上,keylister.filter()和keylister.getAcceptedChars()不被调用,我可以引入任何字符(不限于.getAcceptedChars())
我发现很少有关于keylister的文档。如果你有好的例子或医生,我很感兴趣。
你知道为什么这不管用吗?
我做错了什么?
活动代码示例:

    @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;
    }

}

最佳答案

看看他们声明的android文档:
注意,在大多数情况下,这个接口已经被general
由inputmethod定义的软输入方法;只能使用
如果应用程序有自己的屏幕键盘,并且
想要处理硬键盘事件以匹配它
对于方法:
如果返回type_null,则不提供软键盘。在其他
words,你必须提供自己的键盘用于屏幕输入和
按键监听器将用于处理来自硬键盘的输入。
如果返回任何其他值,将创建一个软输入方法
当用户将焦点放在编辑器中时,编辑器将提供一个小键盘
也会消耗硬键事件。这意味着密钥侦听器
通常不会使用,而是使用软输入方法
根据此处返回的内容类型管理密钥输入。
因此,由于返回内容类型,keylister将被忽略。看来这是不可能的,还是你找到工作了?
或许您可以创建一个自定义的TextWatcher,然后使用EditText.addTextChangedListener(TextWatcher textWatcher)在edittext上设置它?

10-04 10:49