TextWatcher接口解析
轉(zhuǎn)載至 http://www.picksomething.cn/?p=34
1.方法解析
??它有三個(gè)成員方法漫谷,第一個(gè)after很簡單攘已,這個(gè)方法就是在EditText內(nèi)容已經(jīng)改變之后調(diào)用幽纷,重點(diǎn)看下面兩個(gè)方法:
beforeTextChanged(CharSequence s, int start,int count,int after)
這個(gè)方法是在Text改變之前被調(diào)用沐寺,它的意思就是說在原有的文本s中牲览,從start開始的count個(gè)字符將會被一個(gè)新的長度為after的文本替換挠羔,注意這里是將被替換井仰,還沒有被替換。
onTextChanged(CharSequence s, int start,int before,int count)
這個(gè)方法是在Text改變過程中觸發(fā)調(diào)用的破加,它的意思就是說在原有的文本s中俱恶,從start開始的count個(gè)字符替換長度為before的舊文本,注意這里沒有將要之類的字眼范舀,也就是說一句執(zhí)行了替換動作合是。
可能說起來比較抽象,我舉個(gè)簡單的例子锭环,比如說我們監(jiān)聽一個(gè)EditText聪全,默認(rèn)開始的時(shí)候EditText中沒有文本,當(dāng)我們輸入LOVE四個(gè)字母的時(shí)候辅辩,在打印信息中我輸出各個(gè)參數(shù)看一下參數(shù)的變化难礼。
10-18 16:40:21.528: D/Debug(4501): beforeTextChanged 被執(zhí)行----> s=----start=0----after=1----count=0
10-18 16:40:21.528: D/Debug(4501): onTextChanged 被執(zhí)行---->s=L----start=0----before=0----count=1
10-18 16:40:21.532: D/Debug(4501): afterTextChanged 被執(zhí)行---->L
10-18 16:40:29.304: D/Debug(4501): beforeTextChanged 被執(zhí)行----> s=L----start=1----after=1----count=0
10-18 16:40:29.308: D/Debug(4501): onTextChanged 被執(zhí)行---->s=LO----start=1----before=0----count=1
10-18 16:40:29.308: D/Debug(4501): afterTextChanged 被執(zhí)行---->LO
10-18 16:40:32.772: D/Debug(4501): beforeTextChanged 被執(zhí)行----> s=LO----start=2----after=1----count=0
10-18 16:40:32.772: D/Debug(4501): onTextChanged 被執(zhí)行---->s=LOV----start=2----before=0----count=1
10-18 16:40:32.776: D/Debug(4501): afterTextChanged 被執(zhí)行---->LOV
10-18 16:40:34.772: D/Debug(4501): beforeTextChanged 被執(zhí)行----> s=LOV----start=3----after=1----count=0
10-18 16:40:34.772: D/Debug(4501): onTextChanged 被執(zhí)行---->s=LOVE----start=3----before=0----count=1
10-18 16:40:34.776: D/Debug(4501): afterTextChanged 被執(zhí)行---->LOVE
通過上面的打印信息我們可以發(fā)現(xiàn)在輸入L之前beforeTextChanged被執(zhí)行,s為空玫锋,所以s輸入空蛾茉,start=0,也就是從位置0開始撩鹿,count=0谦炬,也就是0個(gè)字符將會被替換,after=1节沦,也就是說0個(gè)字符將會被一個(gè)新的長度為after=1的文本(也就是L)替換键思。
當(dāng)輸入發(fā)生改變的時(shí)候onTextChanged被執(zhí)行,此時(shí)s=L也就是輸入的字母L甫贯,從start=0開始吼鳞,count=1個(gè)字符替換了長度為before=0的舊文本。通俗點(diǎn)將就是字母L從位置0開始替換了原來的空文本获搏,下面的就可以依次類推了赖条。那么我們?nèi)绾卫眠@個(gè)接口監(jiān)聽EditText的文本變化來實(shí)現(xiàn)限制輸入字?jǐn)?shù)的功能呢失乾,我相信大家都有自己的想法了,這里我給出自己的一個(gè)簡單實(shí)現(xiàn)纬乍,主要代碼如下:
source_des.addTextChangedListener(newTextWatcher()
{
private CharSequence temp;
private intselection Start;
private ntselection End;
@Override
public void onTextChanged(CharSequence s,int start,int before,int count){
Log.d(TAG,"onTextChanged 被執(zhí)行---->s="+ s +"----start="+ start+"----before="+before +"----count"+count);
temp = s;
}
public void before textChanged(CharSequence s,int start,int count,int after){
Log.d(TAG,"beforeTextChanged 被執(zhí)行----> s="+ s+"----start="+ start+"----after="+after +"----count"+count);
}
public void afterTextChanged(Editable s){
Log.d(TAG,"afterTextChanged 被執(zhí)行---->"+ s);
selectionStart = source_des.getSelectionStart();
selectionEnd = source_des.getSelectionEnd();if(temp.length() > MAX_LENGTH) {
Toast.makeText(MainActivity.this,"只能輸入九個(gè)字",
Toast.LENGTH_SHORT).show();
s.delete(selectionStart -1, selectionEnd);inttempSelection = selectionEnd;
source_des.setText(s);
source_des.setSelection(tempSelection);
}
}
});
手機(jī)號加空格實(shí)例:http://wuxiaolong.me/2015/07/09/phone_space/