作者博客
http://www.jianshu.com/u/679b178482a6
源碼地址
https://github.com/xiaoniu/WarnningEditText
先上效果:
說明:
圖中的EditText能夠在失去焦點後驗證輸入框中的文本是否與正則表達式匹配,這裡我設置的是5位整數(\d{5}),當輸入110時,不匹配,邊框變紅並抖動,文本清除(gif中白色文本是因為錄製的問題,實際文本已清除);輸入12306,匹配,邊框變綠。
實現方式
繼承EditText,實現構造方法
注意構造方法中要傳入官方的屬性值,否則很多EditText屬性不能在XML裡面定義,並且EditText獲取焦點後不會彈出軟鍵盤。
重寫onDraw,繪製邊框
注意邊框的顏色不要設置常量
重寫onFocusChanged,監聽焦點變化
獲取焦點後,邊框就設置為默認的顏色(灰色),失去焦點後,會判斷是否匹配正則表達式。
創建接口
創建一個OnInputMatchListener的接口,內含onInputWrong和onInputCorrect兩個抽象方法,分別在判斷文本不匹配正則表達式和匹配表達式時回調,回調地址在上面的代碼中。
public interface OnInputMatchListener {
void onInputWrong();
void onInputCorrect();
}
要注意的是:
android:paddingLeft="10dp"
讓文本不是從左邊框開始,而是左邊框靠左一點。
組件的父佈局可以加上
android:focusable="true"
這樣可以避免EditText默認獲取焦點。
3.重中之重:要加上android:background="@null"
。
我們知道android:background="@null"可以去掉EditText默認樣式的下劃線:
但在我自定義EditText的時候,我的邊框是根據組件的寬高貼著邊緣畫的,當組件高度大於42dp時,一切正常:
當高度小於42時,比如30dp,邊框上部就會缺失,或者說邊框繪製
就會從組件外部開始: