android输入框 digst与键盘模式的冲突解决

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);
        }
    }

最终在目前已有的测试机上都通过了测试,巴适。

砥砺前行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值