Android EditText -TextWatch接口

TextWatcher接口解析

轉載至 http://www.picksomething.cn/?p=34

1.方法解析
??它有三個成員方法,第一個after很簡單,這個方法就是在EditText內容已經改變之后調用,重點看下面兩個方法:


beforeTextChanged(CharSequence s, int start,int count,int after)

這個方法是在Text改變之前被調用,它的意思就是說在原有的文本s中,從start開始的count個字符將會被一個新的長度為after的文本替換,注意這里是將被替換,還沒有被替換。


onTextChanged(CharSequence s, int start,int before,int count)

這個方法是在Text改變過程中觸發(fā)調用的,它的意思就是說在原有的文本s中,從start開始的count個字符替換長度為before的舊文本,注意這里沒有將要之類的字眼,也就是說一句執(zhí)行了替換動作。


可能說起來比較抽象,我舉個簡單的例子,比如說我們監(jiān)聽一個EditText,默認開始的時候EditText中沒有文本,當我們輸入LOVE四個字母的時候,在打印信息中我輸出各個參數看一下參數的變化。

 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ā)現在輸入L之前beforeTextChanged被執(zhí)行,s為空,所以s輸入空,start=0,也就是從位置0開始,count=0,也就是0個字符將會被替換,after=1,也就是說0個字符將會被一個新的長度為after=1的文本(也就是L)替換。


當輸入發(fā)生改變的時候onTextChanged被執(zhí)行,此時s=L也就是輸入的字母L,從start=0開始,count=1個字符替換了長度為before=0的舊文本。通俗點將就是字母L從位置0開始替換了原來的空文本,下面的就可以依次類推了。那么我們如何利用這個接口監(jiān)聽EditText的文本變化來實現限制輸入字數的功能呢,我相信大家都有自己的想法了,這里我給出自己的一個簡單實現,主要代碼如下:

    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,"只能輸入九個字",
            Toast.LENGTH_SHORT).show();
            s.delete(selectionStart -1, selectionEnd);inttempSelection = selectionEnd;
            source_des.setText(s);
            source_des.setSelection(tempSelection);
        }
    }
});

手機號加空格實例:http://wuxiaolong.me/2015/07/09/phone_space/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容