最近写个新项目,最烦写注册界面,那么多框每个都要检验,以前懒的不行,今天鼓励下自己,整理整理学习的资料,做个小总结,不过用到的好多东西都找不到是从哪搜到的了,请大侠们见谅了
1、项目要求所有输入框都有一项必要的检查就是字符数量限制,像用户名在5--25个字符范围内,密码要在6--16个字符范围内等等
EditText有一个maxLength属性,可在写布局xml文件时添加这个属性,也可用代码控制:
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter.LengthFilter(10);
mEditText.setFilters(filters);
若输入多于设置的字符数会将新输入的替换掉原始内容的后面的部分。
我是在输入失去焦点时,计算输入框中内容的长度,判断是否符合条件:
et_realname.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
if(CommonUtil.getTextLength(et_realname.getText().toString())<2){
//若小于2个字符提示
}
}
}
});
计算字符数的方法:
public static int getTextLength(String str){
int length=0;
if(null != str){
length=str.getBytes().length;
}
return length;
}
计算字符数的方法是我参考博文 http://632977922.blog.51cto.com/6231950/1274219写的,我没有添加编码方式的考虑。
2、正确性的判断,当输入完邮箱或手机号时总是需验证是否正确
如:手机号输入框只允许输入数字,这个就简单多了,只需要设置android:digits="1234567890"即可
(若限制只能输入字母和数字就写成"1234567890qwertyuioplkjhgfdsazxcvbnm"),
或使用代码控制
EditText mEditText = (EditText)findViewById(R.id.MyEditText);
String digits = "1234567890";
mEditText.setKeyListener(DigitsKeyListener.getInstance(digits));
但是我们要求用户名可以为字母、数字、汉字和下划线时,我就很惆怅了,汉字怎么加进去控制···,
直接把\u4e00-\u9fa5放到digits里面是不管用的···
后来我只能想到就是添加内容变化监听,自己用正则表达式判断输入的是否包含不在允许范围内的特殊符号,
若是存在则将新输入的替换掉,但是注意了!!!!这样就会引起递归的调用onTextChange()方法,
会造成栈溢出,所以我添加了变化前与变化后长度的判断,若是删除操作则不在进行检测
,但是这样也难免会有溢出的情况,所以在自己设置替换输入的非法字符前将监听去掉,
替换完之后再添加上
(不知道有没有什么更好的办法实现检测字母、数字、汉字和下划线的方法,总感觉这么着好笨):
et_userName.addTextChangedListener(nameWatcher);
int beforeLength=0;
int nowLength=0;
//动态监测姓名输入是否符合要求
TextWatcher nameWatcher=new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(null == s || s.equals("")){
return;
}
nowLength=s.length();
if(nowLength<before){//若小于修改之前,则不判断
}else{
// 检查是否只包含汉字、字母、数字和下划线
if(!CommonUtil.isLetterDigitOrChinese(s.toString())){
et_userName.removeTextChangedListener(nameWatcher);
//将新添加字符去除
String text=s.toString().substring(start, start+count);
et_userName.setText(s.toString().replace(text, ""));
et_userName.setSelection(et_userName.length());//调整光标到最后一行
//提示输入了非法字符
et_userName.addTextChangedListener(nameWatcher);
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
beforeLength=s.length();
}
@Override
public void afterTextChanged(Editable s) {
}
};
判断是否为
字母、数字、汉字和下划线的方法
public static boolean isLetterDigitOrChinese(String str){
String regex = "^[_a-z0-9A-Z\u4e00-\u9fa5]+$";
return str.matches(regex);
}
输入完成后,我同样是放到输入框失去焦点后判断输入的内容是否符合要求,判断手机号及邮箱是否正确的方:
/**
* 检测是否为手机号
* @param mobiles 待检测号码字符串
* @return
*/
public static boolean isMobileTel(String mobiles){
Pattern p = Pattern
.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");
Matcher m = p.matcher(mobiles);
return m.matches();
}
/**
* 检测是否为正确的邮箱号
* @param email 待检测号码字符串
* @return
*/
public static boolean isEmail(String email){
Pattern p = Pattern
.compile("^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]*@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$");
Matcher m = p.matcher(email);
return m.matches();
}
正则表达式验证的参考: http://blog.sina.com.cn/s/blog_80723de801015769.html
http://blog.csdn.net/esun6/article/details/7446078
EditText判断的参考,里面还有很多我早就用到了,但是这里没有提的东西:
http://ticktick.blog.51cto.com/823160/1333414
码字真的挺麻烦,现在真是佩服我之前看的那些讲解各种知识的长博客,真是辛苦,
编辑了好多次这个代码样式太纠结了
克服拖延的第一步也是第一批博文,给自己鼓鼓掌,哈哈