packagecom.aimymusic.android.utils;
importandroid.text.InputFilter;
importandroid.text.Spanned;
/**
*根据字符判断可输入长度
*/
public abstract classCharLengthFilterimplementsInputFilter {
//最大可输入长度
private intmaxLen=0;
//超过最大输入长度的提示
public abstract voidonCharsOverflow();
//剩余可输入字数的提示
public abstract voidonRemainNum(intremain);
publicCharLengthFilter(intmax) {
maxLen= max;
}
//参数source:将要插入的字符串,来自键盘输入、粘贴
//参数start:source的起始位置,为0(暂时没有发现其它值的情况)
//参数end:source的长度
//参数dest:EditText中已经存在的字符串
//参数dstart:插入点的位置
//参数dend:插入点的结束位置,一般情况下等于dstart;如果选中一段字符串(这段字符串将会被替换),dstart的值就插入点的结束位置
publicCharSequence filter(CharSequence source,intstart,intend, Spanned dest,intdstart,intdend) {
intdindex =0;
intcount =0;
intdestCountNum =0;
//计算已有字符长度
while(count <=maxLen&& dindex < dest.length()) {
charc = dest.charAt(dindex++);
if(c <128) {
count +=1;
destCountNum +=1;
}else{
count +=2;
destCountNum +=2;
}
}
if(count >maxLen) {
onCharsOverflow();
returndest.subSequence(0, dindex -1);
}
intsindex =0;
//计算需要输入的字符长度
while(count <=maxLen&& sindex < source.length()) {
charc = source.charAt(sindex++);
if(c <128) {
count +=1;
}else{
count +=2;
}
}
//计算需要删除的字符长度
if(source.length() ==0) {
for(inti = dstart; i < dend; i++) {
charc = dest.charAt(i);
if(c <128) {
count -=1;
}else{
count -=2;
}
}
}
if(count >maxLen) {
onCharsOverflow();
sindex--;
}
if(count >=maxLen) {
intcountNum =0;
for(inti =0; i < sindex; i++) {
charc = source.charAt(i);
if(c <128) {
countNum +=1;
}else{
countNum +=2;
}
}
onRemainNum(maxLen- countNum - destCountNum);
}else{
onRemainNum(maxLen- count);
}
returnsource.subSequence(0, sindex);
}
}