packagecom.aimymusic.android.utils;
importandroid.text.InputFilter;
importandroid.text.Spanned;
/**
*根據(jù)字符判斷可輸入長度
*/
public abstract classCharLengthFilterimplementsInputFilter {
//最大可輸入長度
private intmaxLen=0;
//超過最大輸入長度的提示
public abstract voidonCharsOverflow();
//剩余可輸入字?jǐn)?shù)的提示
public abstract voidonRemainNum(intremain);
publicCharLengthFilter(intmax) {
maxLen= max;
}
//參數(shù)source:將要插入的字符串征讲,來自鍵盤輸入诗箍、粘貼
//參數(shù)start:source的起始位置滤祖,為0(暫時(shí)沒有發(fā)現(xiàn)其它值的情況)
//參數(shù)end:source的長度
//參數(shù)dest:EditText中已經(jīng)存在的字符串
//參數(shù)dstart:插入點(diǎn)的位置
//參數(shù)dend:插入點(diǎn)的結(jié)束位置,一般情況下等于dstart匠童;如果選中一段字符串(這段字符串將會(huì)被替換),dstart的值就插入點(diǎn)的結(jié)束位置
publicCharSequence filter(CharSequence source,intstart,intend, Spanned dest,intdstart,intdend) {
intdindex =0;
intcount =0;
intdestCountNum =0;
//計(jì)算已有字符長度
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;
//計(jì)算需要輸入的字符長度
while(count <=maxLen&& sindex < source.length()) {
charc = source.charAt(sindex++);
if(c <128) {
count +=1;
}else{
count +=2;
}
}
//計(jì)算需要?jiǎng)h除的字符長度
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);
}
}