即时将 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的主要内容,如果未能解决你的问题,请参考以下文章