限制輸入固定數量的字符,衆所周知在xml文件中直接配置 android:maxLength=“xx”即可,但是我想這把這個功能封裝成一個組件,根據別人的不同需求去修改相應的限制數值,但是EditText是沒有提供這個方法的,所以要自己搞!!!
分析
android:maxLength
這個屬性可以起作用說明它是在java文件中有初始化操作,所以可以去看EditText源碼,但是在源碼中是找不到這個屬性的,我們知道EditText extends TextView
所以去TextView源碼中找就對了
首先找TextView
的文檔註釋部分如下:
寫過自定義view的同學都知道這個屬性一定在構造方法中做過初始化,所以我可以Ctrl+F去找TextView_maxLength
,如下:
看到或者到這熟悉值後賦值給了maxlength
,默認值爲-1,繼續Ctrl+F去跟蹤maxlength
如下圖:
這裏可以看到是給TextView
設置了一個輸入過濾器InputFilter
,將android:maxLength=“x”
設置的值賦值給LengthFilter
的構造函數,其實LengthFilter
是InputFilter
的一個靜態內部類如下:
紅色標記的就是具體的長度限制邏輯!!!
其實我們給EditText
設置長度的代碼如下:
if (maxlength >= 0) {
mEditText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(maxlength) });
} else {
mEditText.setFilters(NO_FILTERS);
}
這裏主要是要看else中NO_FILTERS,通過命名大寫可以知道是個常量,繼續Ctrl+F去跟蹤如下:
其實就是一個長度爲零的空數組,並且是個常量,但是用private修飾,所以我不能直接應用,所以直接複製到我們的代碼中就ok了,最終效果就是
if (maxlength >= 0) {
mEditText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(maxlength) });
} else {
mEditText.setFilters(new InputFilter[0]);
}
核心知識點就是 InputFilter接口,自己可以通過實現這個接口,加入相關正則表達式去實現不同的需求。
總結
舉一反三,從源碼出手,學習別人的編程思想,完成自己的需求。