android输入框 digst与键盘模式的冲突解决
现需求对输入框的可输入文字进行控制
如
<string name="letter1">0123456789.</string>
<string name="letter2">0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.@_</string>
然后针对这个和已有的需求自定义封装了一个输入框
包含了获得焦点时的下划线,右边的发短信按钮,右边的密码小眼睛按钮...等,并且在此基础上添加了以上的需求代码
if (!TextUtils.isEmpty(digst)) {
//拦截掉非数字
if (digst.equals(getResources().getString(R.string.letter1))){
mEtContent.setKeyListener(DigitsKeyListener.getInstance(digst));
}else if (digst.equals(getResources().getString(R.string.letter2))){
//拦截掉非匹配文字
mEtContent.setKeyListener(DigitsKeyListener.getInstance(digst));
}else{
//TODO other
}
}
提交完代码打版丢给测试就开心回家。
12小时后。。
加了需求需要对对应的输入框根据过滤条件弹出相应最简便的软件盘
于是,这么简单百度了下又加上setInputType
if (!TextUtils.isEmpty(digst)) {
//为数字时弹出数字键盘,拦截掉非数字
if (digst.equals(getResources().getString(R.string.letter1))){
mEtContent.setKeyListener(DigitsKeyListener.getInstance(digst));
mEtContent.setInputType(InputType.TYPE_CLASS_NUMBER);
}else if (digst.equals(getResources().getString(R.string.letter2))){
//为字母时弹出英文键盘,拦截掉非匹配文字
mEtContent.setKeyListener(DigitsKeyListener.getInstance(digst));
mEtContent.setInputType(InputType.TYPE_CLASS_TEXT);
}else{
//TODO other
}
}
粗略看下确实弹出来对应的软件盘了,打包提测收工午休。
.
z
.
Z
.
下午醒来的时候
发现上线前红彤彤的bug单展示了一排(##可以输入特殊符号、*怎么又可以输入中文...),瞌睡瞬间清醒,自己仔细确认了一遍,还真有这个问题。
再次检查代码,反复尝试发现setInputType这个方法会覆盖掉设置好的setKeyListener.
遨游博客,嗷嗷嗷
终于在一个博客中无意看到一个处理
重写DigitsKeyListener方法,虽然它已经被标注过时,但是确实有效,绕过了之前一直出现的大坑,最终代码如下
if (!TextUtils.isEmpty(digst)) {
if (digst.equals(getResources().getString(R.string.letter1)) ){
mEtContent.setKeyListener(new DigitsKeyListener(){
//重写中返回允许通过校验的字符数组
@Override
protected char[] getAcceptedChars() {
return digst.toCharArray();
}
//重写中返回弹出的输入法为数字键盘
@Override
public int getInputType() {
return InputType.TYPE_CLASS_NUMBER;
}
});
}else if(digst.equals(getResources().getString(R.string.letter2))){
mEtContent.setKeyListener(new DigitsKeyListener(){
//重写中返回允许通过校验的字符数组
@Override
protected char[] getAcceptedChars() {
return digst.toCharArray();
}
//重写中返回弹出的输入法为字母键盘
@Override
public int getInputType() {
return InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
}
});
}else{
mEtContent.setRawInputType(InputType.TYPE_CLASS_TEXT);
}
}
最终在目前已有的测试机上都通过了测试,巴适。
砥砺前行