赞
踩
这是2015年的12月31号,以前一直有写博客的冲动,但是由于比较懒,记录的都在其他地方,gitbook也了解过,cdsn 注册了一年多了,写博客是用的markdown ,对于我来说比较陌生,一直拖着。直到2015年的最后一天,才开始写。好了,废话不多说。下面介绍的是具体的几种方法
方法一 在xml中直接限制字符的长度
android:maxLength="10"
即限制最大输入字符个数为10
maxLength的属性 是对 EditText 的字数进行控制的。不管中文还是英文。都是30个字符。显然这存在一定的局限性android:maxEms
//设置TextView的宽度为最长为N个字符的宽度
这个就更加的不靠谱了,实际情况汉子和英文字符同时出现根本不符合要求。
方法二 通过InputFilter来实现
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)}); 即限定最大输入字符数为20,基本能满足需求.
如果需要更加精确的判断需要重写InputFilter,代码如下:
private class NameLengthFilter implements InputFilter {
int MAX_EN;// 最大英文/数字长度 一个汉字算两个字母
String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字
public NameLengthFilter(int mAX_EN) {
super();
MAX_EN = mAX_EN;
}
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
int destCount = dest.toString().length()+ getChineseCount(dest.toString());
int sourceCount = source.toString().length()
+ getChineseCount(source.toString());
if (destCount + sourceCount > MAX_EN) {
Toast.makeText(MainActivity.this, getString(R.string.count),
Toast.LENGTH_SHORT).show();
return "";
} else {
return source;
}
}
private int getChineseCount(String str) {
int count = 0;
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
while (m.find()) {
for (int i = 0; i <= m.groupCount(); i++) {
count = count + 1;
}
}
return count;
}
}
改完后能更加精确的判断 editText.setFilters(new InputFilter[]{new NameLengthFilter(20)});
方法三 通过监听editText的输入字符的事件
在监听字符串输入的时候,通过ASCII码判断字符串的个数
edittext.addTextChangedListener(new TextWatcher(){
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
int editStart = getSelectionStart();
int editEnd = getSelectionEnd();
while (calculateLength(s.toString()) > 20) {
// 当输入字符个数超过限制的大小时,进行截断操作
((Editable) s).delete(editStart - 1, editEnd);
editStart--;
editEnd--;
}
}
@Override
public void afterTextChanged(Editable s) {}
});
}
private long calculateLength(CharSequence c) {
double len = 0;
for (int i = 0; i < c.length(); i++) {
int tmp = (int) c.charAt(i);
if (tmp > 0 && tmp < 127) {
len += 0.5;
} else {
len++;
}
}
return Math.round(len);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。