代码中动态自定义EditText可输入字符


最近做系统设置网络设置模块,发现了一些挺有意思的需求,比如:

4.1.代理option : 【无】、【手动】、【自动】。默认选中【无】,option为radio交互1)选择手动时,显示【服务器主机名】文本框、【服务器端口】文本框、【绕过代理】文本框。

约束条件 :

 • 【服务器主机名】限制录入英文(包括特殊字符)或数字字符• 【服务器端口】限制录入数字字符;最多不超过5个字符

• 【绕过代理】限制录入英文(包括特殊字符)或数字字符【连接】btn启用条件:

• 必须在【服务器主机名】文本框与【服务器端口】文本框录入字符

• 当在【服务器主机名】或【绕过代理】录入字符【.】时,每个【.】前后需录入字段,否则【连接】btn禁用

那么问题来了,好像没有一个flag是直接支持只输入数字、英文和.的,又由于我的view都是动态添加的,所以不能直接在xml中设置digist字典,何解?

其实也是有办法的,如下:

EditText content = (EditText) view.findViewById(R.id.radio_sub_item_content);
if (editBean.getEditType()==InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS){
content.setKeyListener(new DigitsKeyListener(Locale.getDefault()){
@Override
protected char[] getAcceptedChars() {
String acceptedChars=mContext.getString(R.string.network_edit_input_char);
return acceptedChars.toCharArray();
}
});
}else {
content.setInputType(editBean.getEditType());
}

关键点在这里:覆写方法getAcceptedChars,其实还有很多可以覆写的方法,大家可以自行探索

content.setKeyListener(new DigitsKeyListener(){
@Override
protected char[] getAcceptedChars() {
String acceptedChars=mContext.getString(R.string.network_edit_input_char);
return acceptedChars.toCharArray();
}
});

很显而易见,我返回的就是自己需要的字符了,这样无论键盘上按了什么,都ok

字符串内容:

<string name="network_edit_input_char" translatable="false">qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM1234567890.</string>
 
InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS 这个type单用是不生效的,至于如何让他生效,其实我也没试出来,别人说要用或,但是至于什么和什么或,我就呵呵了,如果有人知道,还请告知一声,毕竟还是很好奇的。
以上,希望对你有帮助。

声明:TIL|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA[ZH]协议进行授权

转载:转载请注明原文链接 - 代码中动态自定义EditText可输入字符


Life is very interesting. In the end, some of your greatest pains become your greatest strengths.