抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

代码中动态自定义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单用是不生效的,至于如何让他生效,其实我也没试出来,别人说要用或,但是至于什么和什么或,我就呵呵了,如果有人知道,还请告知一声,毕竟还是很好奇的。
以上,希望对你有帮助。

0条评论

发表评论