Android 通過java代碼實現EditText輸入限制

限制輸入固定數量的字符,衆所周知在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的構造函數,其實LengthFilterInputFilter的一個靜態內部類如下:
在這裏插入圖片描述
紅色標記的就是具體的長度限制邏輯!!!


其實我們給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接口,自己可以通過實現這個接口,加入相關正則表達式去實現不同的需求。


總結


 舉一反三,從源碼出手,學習別人的編程思想,完成自己的需求。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章