即时将 InputType 从 Text 切换为 Number

Posted

技术标签:

【中文标题】即时将 InputType 从 Text 切换为 Number【英文标题】:Switch InputType from Text to Number on the fly 【发布时间】:2015-04-03 18:11:39 【问题描述】:

加拿大邮政编码格式如下: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】:

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

事实上,大多数键盘甚至都不会触发这个 - XXXKeyListener 类通常只被硬件键盘调用,从而导致 keydown 和 keyup 事件。软件键盘通常不会这样做。你最初是否给这个字段一个 NULL 输入类型?这是唯一能让普通软键盘假装成硬件键盘的东西。

另外一件事——在字段处于活动状态时设置输入模式通常效果不佳。如果您不重置输入连接,大多数键盘甚至都不会检测到它(键盘端没有更改输入类型 API)。如果您确实重置了输入连接,您可能会遇到各种带有自动更正和计时的奇怪行为(我知道 Swype 有十几种不同的规则来消除重置输入连接干扰的事件)。永远不建议更改输入类型。

【讨论】:

我猜是这样,但是那些加拿大邮政编码真的很烦人。有一个初始文本输入类型。还有一个长度输入过滤器(6),但我覆盖了它,它似乎没有被击中。谢谢你的回答

以上是关于即时将 InputType 从 Text 切换为 Number的主要内容,如果未能解决你的问题,请参考以下文章

切换tab键,不聚焦a标签

如何使用 jquery 在 input type="text" 和 textarea 之间切换

将多个值从表单插入到数组

原生js表格即时编辑

在 iOS 中切换位置权限

手机浏览器访问页面时,点击输入框如何自动切换到数字键盘,请大侠们指教