TextView和EditText中的setFilters方法說明


在TextView中有一個方法public void setFilters(InputFilter[] filters),API中有一句說明:Sets the list of input filters that will be used if the buffer is Editable.  Has no effect otherwise。InputFilter的作用是對輸入的文字進行過濾,可以自定義處理,這句話的意思是可以設置自定義處理對象列表,但是他們是否會起作用還要看TextView的文字緩沖區是否是Editable。

       所以,我們進到Editable的API頁面,可以看到Editable類也有個方法public void setFilters(InputFilter[] filters),翻開TextView源碼可以看到下面兩段代碼:

 

public void setFilters(InputFilter[] filters) {
if (filters == null) {
throw new IllegalArgumentException();
}
mFilters = filters;
if (mText instanceof Editable) {
setFilters((Editable) mText, filters);
}
}


private void setFilters(Editable e, InputFilter[] filters) {
if (mEditor != null && mEditor.mKeyListener instanceof InputFilter) {
InputFilter[] nf = new InputFilter[filters.length + 1];
System.arraycopy(filters, 0, nf, 0, filters.length);
nf[filters.length] = (InputFilter) mEditor.mKeyListener;
} else {
e.setFilters(filters);
}
}
        通過上面的代碼可以看到,TextView的setFilters方法實際上是Editable對象setFilters方法的代理。在Editable類API中對setFilters方法的描述是這樣的:Sets the series of filters that will be called in succession whenever the text of this Editable is changed, each of which has the opportunity to limit or transform the text that is being inserted。意思大概是說,這個方法為Editable對象設置了一組文字過濾器,當文字發生變化時,每一個過濾器都有機會發生作用。

 

        Android SDK中定義了一組InputFilter接口的實現,但是,大多數時間我們可以自己實現InputFilter接口,主要是實現CharSequence filter(CharSequence source,int start,int end,Spanned dest,int dstart,int dend)接口方法,這里六個參數的意義分別為:

 

source 新輸入的字符串
start 新輸入的字符串起始下標,一般為0
end 新輸入的字符串終點下標,一般為source長度-1
dest 輸入之前文本框內容
dstart 原內容起始坐標,一般為0
dend 原內容終點坐標,一般為dest長度-1

        我們可以在filter實現方法中對source進行判斷處理,並返回一個CharSequence對象,追加到dest后面;

 

 

 

 一般需要限制一個EditText的最大輸入字符數,就直接在布局文件里為標簽添加maxLength屬性就可以了,但是這種方法有的時候並不適用,比如你在代碼中為空間又添加了一個InputFilter,這個filter的作用可能是對你輸入的字符進行一些格式上的限制,那么這個filter就會使你在布局文件中定義的maxLength失效。這個時候就需要在代碼中設置EditText的最大輸入字符數。

1.獲取控件:

et_vcode = (EditText)view_vcode.findViewById(R.id.EditText_VCode);


2.設置規則:

et_vcode.setFilters();參數是一個InputFilter類型的數組
如果直接添加限制字數的規則,直接newLengthFilter就可以了,例如限制輸入最大不超過16位:
et_vcode.setFilters(new InputFilter[]{new InputFilter.LengthFilter(16)});

如果此時你還有另一個規則,例如只能輸入a-z的小寫字母,直接在InputFilter數組中添加就可以了。
et_vcode.setFilters(new InputFilter[]{codeInputFilter, new InputFilter.LengthFilter(16)});

codeInputFilter繼承InputFilter,規則自己定義,重寫里面的
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {}
這個方法,返回空字符串,就代表匹配不成功,返回null代表匹配成功


免責聲明!

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



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