繁体   English   中英

Android:EditText的KeyListener无法正常工作

[英]Android : KeyListener of EditText not working

我正在尝试过滤EditText的输入字符以仅允许有效的浮点值。 (例如:“12,45”,只有一个逗号,......)。

为此,我使用KeyListener (不要与onKeyListener或textChangeListener混淆。我想阻止用户输入无效数据)。

在Android 2.3.6和3.2上,没有调用keyListener.filter()和keyListener.getAcceptedChars(),我可以引入任何char(不限于.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;
    }

}

查看Android文档,他们声明与KeyListener相关:

请注意,对于大多数情况,此接口已被InputMethod定义的常规软输入方法取代; 它应该仅用于应用程序具有自己的屏幕键盘并且还希望处理硬键盘事件以匹配它的情况

对于方法getInputType()

如果返回TYPE_NULL,则不会提供软键盘。 换句话说,您必须提供自己的键盘用于屏幕输入,并且键监听器将用于处理来自硬键盘的输入。

如果返回任何其他值,当用户将焦点置于编辑器中时,将创建软输入方法,这将提供键盘并消耗硬键事件。 这意味着通常不会使用密钥监听器,而软输入方法将根据此处返回的内容类型来管理密钥输入。

因此,因为您返回内容类型,所以会忽略KeyListener。 看起来这是不可能的,或者你找到了解决方法吗?

也许您可以创建一个自定义TextWatcher ,然后使用EditText.addTextChangedListener(TextWatcher textWatcher)在EditText上设置它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM