寫這篇文章的原因 在移動端一般很少使用複雜的表單,一般針對於屬性的更改都會打開一個新的頁面進行更改。雖然不多,但是也會有。如果一個頁面要輸入的內容包括姓名、地址、郵箱、手機號等,對各個屬性的驗證會非常麻煩,並且非常的不優雅。 於是, 就出現了,一種基於規則的 輸入驗證庫,通過註解即可標註驗證規則。 ...
寫這篇文章的原因
在移動端一般很少使用複雜的表單,一般針對於屬性的更改都會打開一個新的頁面進行更改。雖然不多,但是也會有。如果一個頁面要輸入的內容包括姓名、地址、郵箱、手機號等,對各個屬性的驗證會非常麻煩,並且非常的不優雅。
於是,saripaar
就出現了,一種基於規則的Android UI
輸入驗證庫,通過註解即可標註驗證規則。
使用過程中發現只有四個字:簡單好用。但是官方對註解的使用並沒有一份完整的文檔,故參考源碼整理了現有的所有註解(基於版本2.0.3
)。
如何使用
導入依賴
第一步當然是導入依賴啦,可通過implementation 'com.mobsandgeeks:android-saripaar:(latest version)'
導入saripaar
,將(latest version)
替換為最新版本即可。
使用註解
對需要進行驗證的可輸入View
加上註解來標註驗證規則,例
@Length(min = 6, max = 9)
private AppCompatEditText et1;
該註解表示et1
中的輸入內容長度只能在6到9的閉區間。
實例化Validator
mValidator = new Validator(this);
mValidator.setValidationListener(this);
Validator
負責驗證給定容器中的View
,通常容器為Activity
或Fragment
。但也可以用包含View
的其他類作為容器。
實現ValidationListener
public class MainActivity extends AppCompatActivity implements Validator.ValidationListener {
// Code…
@Override
public void onValidationSucceeded() {
Toast.makeText(this, "成功了!", Toast.LENGTH_LONG).show();
}
@Override
public void onValidationFailed(List<ValidationError> errors) {
Toast.makeText(this, "失敗了!", Toast.LENGTH_LONG).show();
}
}
ValidationListener
用戶監聽回調結果,併進行相應的處理。
調用驗證方法
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mValidator.validate();
}
});
其餘的高級用法在此不做介紹,該文章主要介紹各個註解的使用。
註解
@AssertFalse
描述
用於判斷輸入內容是否為false
。
作用範圍
CheckBox
RadioButton
RadioGroup
參數
sequence
:確定規則的判定順序,當單個View
有多個規則時生效messageResId
:錯誤提示文字的資源文件IDmessage
:錯誤提示文字
註:所有註解均有這三個參數,故之後註解省略不寫
@AssertTrue
描述
用於判斷輸入內容是否為true
。
作用範圍
CheckBox
RadioButton
RadioGroup
@Checked
描述
用於判斷輸入內容是否為預設值,預設預設值為true
。
作用範圍
CheckBox
RadioButton
RadioGroup
參數
value
:用於設置預設值,預設為true
@ConfirmEmail
描述
判斷當前輸入內容與被@Email
註解的View
的內容是否一致。
註:當前容器所持有的被@Email
註解的View
必須且只允許有一個。
作用範圍
TextView
@ConfirmPassword
描述
判斷當前輸入內容與被@Password
註解的View
的內容是否一致。
註:當前容器所持有的被@Password
註解的View
必須且只允許有一個。
作用範圍
TextView
@CreditCard
描述
判斷輸入內容是否符合信用卡卡號規則。
作用範圍
TextView
參數
cardTypes
:是一個數組,用於確定信用卡的類型,每種類型對應著不同的正則表達式Type.AMEX
,美國運通卡,對應著^(3[47]\d{13})$
Type.DINERS
,大萊信用卡,對應著^(30[0-5]\d{11}|3095\d{10}|36\d{12}|3[8-9]\d{12})$
Type.DISCOVER
,發現卡,對應著^(6011\d{12})$
、^(64[4-9]\d{13})$
和^(65\d{14})$
Type.MASTERCARD
,萬事達卡,對應著^(5[1-5]\d{14})$
Type.VISA
,簽證卡,對應著^(4)(\d{12}|\d{15})$
Type.NONE
,不允許任何內置的信用卡,適用於自定義信用卡類型
@DecimalMax
描述
限制輸入內容的最大值,輸入內容會被強轉為Double
類型,若輸入文字不符合Double
類型,會報ConversionException
異常。
作用範圍
TextView
參數
value
:double
類型,最大值。
@DecimalMin
描述
限制輸入內容的最小值,輸入內容會被強轉為Double
類型,若輸入文字不符合Double
類型,會報ConversionException
異常。
作用範圍
TextView
參數
value
:double
類型,最小值。
@Digits
描述
判斷輸入內容是否為數字,可定義整數部分以及小數部分的最大位數。
作用範圍
TextView
參數
integer
:整數部分最大位數fraction
:小數部分最大位數
註:輸入內容需滿足正則
String.format("(\\d{0,%d})(\\.\\d{1,%d})?", integer, fraction);
@Domain
描述
判斷輸入內容是否是一個有效的功能變數名稱。
作用範圍
TextView
參數
allowLocal
:本地地址是否有效,預設為false
@Email
描述
判斷輸入內容是否是一個有效的郵箱地址。
作用範圍
TextView
參數
allowLocal
:本地地址是否有效,預設為false
@Future
描述
判斷輸入的時間是否是未來時間(與當前時間相比)。輸入的時間必須滿足相應的格式。
作用範圍
TextView
參數
dateFormat
:時間的格式,預設為dd-MM-yyyy
,以下為saripaar
提供的格式(可自定義)DateFormats.DMY
:dd-MM-yyyy
DateFormats.YMD
:yyyy-MM-dd
DateFormats.MDY
:MM-dd-yyyy
DateFormats.DMY_TIME_12_HOURS
:dd-MM-yyyy hh:mm aa
DateFormats.YMD_TIME_12_HOURS
:yyyy-MM-dd hh:mm aa
DateFormats.MDY_TIME_12_HOURS
:MM-dd-yyyy hh:mm aa
DateFormats.DMY_TIME_24_HOURS
:dd-MM-yyyy kk:mm
DateFormats.YMD_TIME_24_HOURS
:yyyy-MM-dd kk:mm
DateFormats.MDY_TIME_24_HOURS
:MM-dd-yyyy kk:mm
dateFormatResId
:時間格式的資源ID
@IpAddress
描述
判斷輸入的內容是否是一個IP
,IPv4
或IPv6
作用範圍
TextView
@Isbn
描述
判斷輸入的內容是否是一個Isbn
,即國際標準書號。
作用範圍
TextView
@Length
描述
限制輸入內容的文本長度,可自定義最大長度和最小長度。
作用範圍
TextView
參數
min
:文本的最小長度,預設為Integer.MIN_VALUE
max
:文本的最大長度,預設為Integer.MAX_VALUE
trim
:是否需要先做trim
操作,預設為false
@Max
描述
限制輸入內容的最大值,輸入內容會被強轉為Integer
類型,若輸入文字不符合Integer
類型,會報ConversionException
異常。
作用範圍
TextView
參數
value
:int
類型,最大值。
@Min
描述
限制輸入內容的最小值,輸入內容會被強轉為Integer
類型,若輸入文字不符合Integer
類型,會報ConversionException
異常。
作用範圍
TextView
參數
value
:int
類型,最小值。
@NotEmpty
描述
判斷輸入內容是否非空。
作用範圍
TextView
參數
trim
:判斷之前是否要先trim
,預設為false
emptyText
:設置“空字元串”,可自定義一段文本,當輸入此文本是則為空emptyTextResId
:設置“空字元串”的資源文件
@Order
描述
確定校驗欄位的順序。當一個容器有多個View
需要檢驗時,可通過該註解確定校驗順序。
作用範圍
TextView
CheckBox
RadioButton
RadioGroup
Spinner
參數
value
:int
類型,用於確定順序
@Password
描述
用於校驗文本是否符合密碼的規則。
作用範圍
TextView
參數
min
:最小字元數,預設為6scheme
:Scheme
類型,利用正則確定密碼的輸入格式,只能為Scheme
類型,不可自定義,預設為Password.Scheme.ANY
Password.Scheme.ANY
:.+
Password.Scheme.ALPHA
:\w+
Password.Scheme.ALPHA_MIXED_CASE
:(?=.*[a-z])(?=.*[A-Z]).+
Password.Scheme.NUMERIC
:\d+
Password.Scheme.ALPHA_NUMERIC
:(?=.*[a-zA-Z])(?=.*[\d]).+
Password.Scheme.ALPHA_NUMERIC_MIXED_CASE
:(?=.*[a-z])(?=.*[A-Z])(?=.*[\d]).+
Password.Scheme.ALPHA_NUMERIC_SYMBOLS
:(?=.*[a-zA-Z])(?=.*[\d])(?=.*([^\w])).+
Password.Scheme.ALPHA_NUMERIC_MIXED_CASE_SYMBOLS
:(?=.*[a-z])(?=.*[A-Z])(?=.*[\d])(?=.*([^\w])).+
@Past
描述
判斷輸入的時間是否是過去時間(與當前時間相比)。輸入的時間必須滿足相應的格式。
作用範圍
TextView
參數
dateFormat
:時間的格式,預設為dd-MM-yyyy
,以下為saripaar
提供的格式(可自定義)DateFormats.DMY
:dd-MM-yyyy
DateFormats.YMD
:yyyy-MM-dd
DateFormats.MDY
:MM-dd-yyyy
DateFormats.DMY_TIME_12_HOURS
:dd-MM-yyyy hh:mm aa
DateFormats.YMD_TIME_12_HOURS
:yyyy-MM-dd hh:mm aa
DateFormats.MDY_TIME_12_HOURS
:MM-dd-yyyy hh:mm aa
DateFormats.DMY_TIME_24_HOURS
:dd-MM-yyyy kk:mm
DateFormats.YMD_TIME_24_HOURS
:yyyy-MM-dd kk:mm
DateFormats.MDY_TIME_24_HOURS
:MM-dd-yyyy kk:mm
dateFormatResId
:時間格式的資源ID
@Pattern
描述
判斷輸入的內容是否滿足正則表達式。
作用範圍
TextView
參數
regex
:正則表達式caseSensitive
:是否區分大小寫
@Select
描述
判斷選擇的索引是否等於預設值,如果不等於則通過,預設值為0。
作用範圍
Spinner
參數
defaultSelection
:設置預設值
@Url
描述
判斷輸入的內容是否是一個url
。
作用範圍
TextView
參數
schemes
:是一個數組,url
的協議數組,可自定義,預設為{"http", "https", "ftp"}
allowFragments
:url
片段是否允許通過,預設為true
對於@Optional
和@Or
雖然該版本已經有了這兩個註解,但是並不能使用,參考作者在stackoverflow
上的回覆,註解將會在2.1.0
版本上線
總結
本篇文章簡單介紹了Android Saripaar
的用法,並著重列舉了各個註解的作用以及各個參數的意思,方便以後的查詢。
通過閱讀源碼對saripaar
有了更深的認識,並對基於註解的框架有了一個完備的認知。
以後如果有時間的話總結一下Android Saripaar
實現的細節。