Android 动态将InputType从文本切换为数字
加拿大邮政编码的格式如下:Android 动态将InputType从文本切换为数字,android,postal-code,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_
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)
。。。(继续,但从未提及我的课程。)
我的猜测是,输入类型不喜欢视图中已经存在不受支持的字符。输入类型实际上并不限制允许的键,它是向键盘提示将输入什么,因此键盘可以决定更改其UI。没有任何内容阻止您向数字字段添加文本。在您设置的筛选器中调用replace可能会出现问题(筛选器与输入类型不同) 事实上,大多数键盘甚至不会触发这种情况-XXXKeyListener类通常只由硬件键盘调用,而硬件键盘会导致keydown和keydup事件。软件键盘通常不会这样做。您最初是否为该字段指定了空输入类型?这是唯一能让普通软键盘假装成硬件键盘的东西
哦,还有一件事——在字段处于活动状态时设置输入模式通常不起作用。如果不重置输入连接,大多数键盘甚至不会检测到它(键盘端没有更改输入类型API)。如果您确实重置了输入连接,您可能会遇到各种各样的自动更正和计时的奇怪行为(我知道Swype有十几种不同的规则来消除重置输入连接所干扰的事件的抖动)。不建议更改输入类型。我想是的,但加拿大邮政编码确实很适合输入。有一个初始文本输入类型。还有一个长度inputfilter(6),但我重写了它,它似乎没有被命中。谢谢你的回答