输入文本限制20个字符,中文(2字符)、英文(1个)、表情(2个)都可以。
出现问题的先提条件:
前19字符个输入字母或数字,最后一个汉字是没有问题的。就不会显示上去。
但是最后输入表情就会被截断。显示乱码。
就是这样的效果:466464464646646666�
正常时应该跟文字同样的效果,不会显示上去。
然后追踪逻辑:
文字:
表情:
InputFilter[] mFilter = { new NameLengthFilter(20) };
mSsid.setFilters(mFilter);
private class NameLengthFilter implements InputFilter {
int mMaxLength;
String mRegEx = "[\\u4e00-\\u9fa5]";
NameLengthFilter(int max_length){
super();
mMaxLength = max_length;
}
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
int mDestCount = dest.toString().length()
+ getChineseCount(dest.toString());
int mSourceCount = source.toString().length()
+ getChineseCount(source.toString());
if(mDestCount + mSourceCount > mMaxLength){
int dispatch = mMaxLength - mDestCount;
if(dispatch <= 0 ){
return "";
}
return getStringForBit(source, Math.abs(dispatch));
} else {
return source;
}
}
private int getChineseCount(String str){
int count = 0;
Pattern p = Pattern.compile(mRegEx);
Matcher m = p.matcher(str);
while(m.find()){
for(int i = 0;i <= m.groupCount(); i++)
count = count + 1;
}
return count;
}
private CharSequence getStringForBit(CharSequence str, int bit){
int index = 0;
int bitNum = 0;
for(int i = 0; i < str.length(); i++){
char ch = str.charAt(i);
if(isMessyCode(str.toString())){
bitNum = bitNum + 2 + getChineseCount(String.valueOf(ch));
}else{
bitNum = bitNum + 1 + getChineseCount(String.valueOf(ch));
}
if(bitNum > bit){
index = i;
break;
}
}
return str.subSequence(0, index);
}
}
private static boolean isMessyCode(String strName) {
try {
Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
Matcher m = p.matcher(strName);
String after = m.replaceAll("");
String temp = after.replaceAll("\\p{P}", "");
char[] ch = temp.trim().toCharArray();
int length = (ch != null) ? ch.length : 0;
for (int i = 0; i < length; i++) {
char c = ch[i];
if (!Character.isLetterOrDigit(c)) {
String str = "" + ch[i];
if (!str.matches("[\u4e00-\u9fa5]+")) {
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}