即时将InputType从Text切换到Number

时间:2015-04-03 18:11:39

标签: android postal-code

加拿大邮政编码具有以下格式:A1A1A1,并匹配以下正则表达式:

[ABCEGHJKLMNPRSTVXY][0-9][A-Z][0-9][A-Z][0-9]

我正在为用户设置EditText以输入他们的邮政编码。我想显示文本和数字键盘。

天真地,我在TextWatcher或InputFilter

中使用此代码
if (Character.isDigit(s.charAt(s.length() - 1))) {
    zipView.setInputType(InputType.TYPE_CLASS_TEXT
                                    | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS
                                    | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
} else {
    zipView.setInputType(InputType.TYPE_CLASS_PHONE);
}

但是,当用户输入第一个数字时,这会导致异常。

java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:464)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33)
        at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:121)
        at android.widget.TextView.doKeyDown(TextView.java:5787)
        at android.widget.TextView.onKeyDown(TextView.java:5600)
        at android.view.KeyEvent.dispatch(KeyEvent.java:2609)

...(继续不提我的课程。)

我的猜测是输入类型不喜欢视图中已有不支持的字符。

1 个答案:

答案 0 :(得分:0)

输入类型实际上并不限制允许的键,它提示键盘输入的内容,因此键盘可以决定更改其UI。没有什么可以阻止您向数字字段添加文本。在您设置的过滤器中调用replace似乎是一个问题(过滤器与输入类型不同)。

事实上,大多数键盘甚至都不会触发 - XXXKeyListener类通常只能由导致keydown和keyup事件的硬件键盘调用。软件键盘通常不这样做。你最初给这个字段一个NULL输入类型吗?这是使平均软键盘试图伪装成硬件的唯一因素。

哦另外一件事 - 在字段激活时设置输入模式通常不能很好地工作。如果您不重置输入连接,大多数键盘甚至都不会检测到它(键盘端没有更改输入类型API)。如果你确实重置了输入连接,你可能会遇到各种奇怪的行为,包括自动更正和定时(我知道Swype有十几种不同的规则可以对重置输入连接的事件进行去抖动)。不建议不要更改输入类型。