Android addTextChangedListener(文本監聽)參數解釋及實現EditText字數監聽


由於最近做項目要檢測EditText中輸入的字數長度,從而接觸到了Android中EditText的監聽接口,TextWatcher。
它有三個成員方法,第一個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改變過程中觸發調用的,它的意思就是說在原有的文本s中,從start開始的count個字符替換長度為before的舊文本,注意這里沒有將要之類的字眼,也就是說一句執行了替換動作。
可能說起來比較抽象,我舉個簡單的例子,比如說我們監聽一個EditText,默認開始的時候EditText中沒有文本,當我們輸入LOVE四個字母的時候,在打印信息中我輸出各個參數看一下參數的變化。

10-18 16:40:21.528: D/Debug(4501): beforeTextChanged 被執行----> s=----start=0----after=1----count=0
10-18 16:40:21.528: D/Debug(4501): onTextChanged 被執行---->s=L----start=0----before=0----count=1
10-18 16:40:21.532: D/Debug(4501): afterTextChanged 被執行---->L
10-18 16:40:29.304: D/Debug(4501): beforeTextChanged 被執行----> s=L----start=1----after=1----count=0
10-18 16:40:29.308: D/Debug(4501): onTextChanged 被執行---->s=LO----start=1----before=0----count=1
10-18 16:40:29.308: D/Debug(4501): afterTextChanged 被執行---->LO
10-18 16:40:32.772: D/Debug(4501): beforeTextChanged 被執行----> s=LO----start=2----after=1----count=0
10-18 16:40:32.772: D/Debug(4501): onTextChanged 被執行---->s=LOV----start=2----before=0----count=1
10-18 16:40:32.776: D/Debug(4501): afterTextChanged 被執行---->LOV
10-18 16:40:34.772: D/Debug(4501): beforeTextChanged 被執行----> s=LOV----start=3----after=1----count=0
10-18 16:40:34.772: D/Debug(4501): onTextChanged 被執行---->s=LOVE----start=3----before=0----count=1
10-18 16:40:34.776: D/Debug(4501): afterTextChanged 被執行---->LOVE

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

source_des.addTextChangedListener(new TextWatcher() { 
    private CharSequence temp; 
    private int selectionStart; 
    private int selectionEnd; 
    
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
        Log.d(TAG, "onTextChanged 被執行---->s=" + s + "----start="+ start 
          + "----before="+before + "----count" +count); temp = s; 
    }
 
    public void beforeTextChanged(CharSequence s, int start, int count,int after) { 
        Log.d(TAG, "beforeTextChanged 被執行----> s=" + s+"----start="+ start 
          + "----after="+after + "----count" +count); 
    } 

    public void afterTextChanged(Editable s) { 
        Log.d(TAG, "afterTextChanged 被執行---->" + 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); 
            int tempSelection = selectionEnd; 
            source_des.setText(s); 
            source_des.setSelection(tempSelection); 
        } 
    } 
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM