EasyValidate,優雅地校驗提交資料完整性
前言
在日常的Android開發中,我們在做登入註冊等帶有提示性輸入校驗的時候。常常會寫樣子寫程式碼:

img_code_1.png
然後你會發現每一次寫帶有提交資訊頁面的時候都不得不去編寫這種千篇一律的程式碼,那。。。。有沒有一種更加優雅得實現方式呢?So,我就是在這種情況下去編寫了一個專案,希望自己能把更多的注意力放在其他地方。(PS:比如偷懶)
一、如何優雅地實現程式碼
說到用優雅得方式寫程式碼,不得不提AnnotationProcessor,一個用於編譯時掃描和處理註解工具。它能很好得幫我們處理一些具有規律的,重複性的程式碼勞動。So,作為一位矮肥圓,不得不承認,這東西很適合我。所以,我使用它結合Butternife寫了一個校驗提交前資料合法性的一個工具,用於即將重構的專案。
二、EasyValidate
- 使用方法,在Project下的build.gradle檔案下面的allprojects中新增以下程式碼片段
allprojects { repositories { google() jcenter() maven {url "https://dl.bintray.com/liweihua/maven/"} } }
- 然後,在module的build.gradle中新增
implementation 'com.eiualee:easyvalidate:1.0.0' annotationProcessor 'com.eiualee:easyvalidate-compiler:1.0.0'
三、用法
EasyValidate
提供了3種註解驗證,注:Plan欄位等下再說
- ①
ValidateNull (控制元件空判斷,當控制元件為空時,提示toast中填寫的內容)
@Retention(RetentionPolicy.CLASS) @Target(ElementType.FIELD) public @interface ValidateNull { int id();//控制元件ID String toast();//不合法時提示的內容 int[] plan() default {Plan.DEFAULT};//校驗計劃 }
- ②
ValidateCheck (判斷控制元件是否選中狀態, 當控制元件選中的狀態與validateState欄位的值相同時會提示toast中的內容)
@Retention(RetentionPolicy.CLASS) @Target(ElementType.FIELD) public @interface ValidateCheck { int id();//控制元件ID String toast();//不合法時提示的內容 int[] plan() default {Plan.DEFAULT};//校驗計劃 boolean validateState() default false;//勾選的值不能與此相同,相同的話提示錯誤 }
- ③
ValidateRegular(判斷控制元件內容是否符合正則表示式)
@Retention(RetentionPolicy.CLASS) @Target(ElementType.FIELD) public @interface ValidateRegular { int id();//控制元件ID String toast();//不合法時提示的內容 int[] plan() default {Plan.DEFAULT};//校驗計劃 String regular(); }
當了解完上面3中註解後,我們就可以開始愉快的程式設計了。試著在控制元件上面這樣子使用,噢不,先得呼叫一個方法,使用與 Butternife
一致,畢竟是基於它寫出來的。以下為初始化時呼叫的程式碼:
IValidate IVALIDATE = EasyValidate.bind(this); IVALIDATE.setUnValidateListener(new IValidate.OnViewUnValidateListener() { //失敗時的回撥(viewid:驗證失敗View的id,toast:註解上的內容) @Override public void unValidate(int viewId, String toast) { ToastUtils.showLongToast(toast); } });
呼叫 EasyVlidate.bind();
方法並返回一個 IValidate
,用 IValidate
實現
一個介面。這個介面主用於校驗失敗時回撥,畢竟失敗時不一定都是 Toast
內容是吧!這樣子便於拓展。
- Fragment
IValidateIVALIDATE = EasyValidate.bind(this, fragmentView); IVALIDATE.setUnValidateListener(new IValidate.OnViewUnValidateListener() { //失敗時的回撥(viewid:驗證失敗View的id,toast:註解上的內容) @Override public void unValidate(int viewId, String toast) { ToastUtils.showLongToast(toast); } });
與Activity的使用方法差不多,只是 EasyValidate.bind(this, fragmentView);
需要變化一下
- 釋放資源
IVALIDATE.unBind();
現在為註解使用事項
- 註解的使用
@ValidateNull(id = R.id.et_input1, toast = "輸入框1為空") EditText et_input1; @ValidateCheck(id = R.id.cb_check. toast = "請勾選xxxx注意事項後重新提交") CheckBox cb_check; //18位身份證號碼 public static final String REGEX_ID_CARD = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$"; @ValidateRegular(id = R.id.et_input3, toast = "輸入框3內容不符合18位身份證", regular = REGEX_ID_CARD, plan = Plan.B) EditText et_input3;
- 呼叫驗證的方法
if(!IVALIDATE.isValidatePass(Plan.DEFAULT)){ //Todo 驗證不通過 return; }
以上就是繫結介面、使用註解、開始驗證、解綁介面一整套的流程了,是不是很簡單。。。哦對了,在上面呼叫驗證方法是會有一個 Plan.DEFAULT
這個是幹嘛的呢?請接著看。
Plan的使用(註解中預設的Plan為DEFAULT)
-
當我們在開發的時候。假設會有以下這麼一種需求:
手機號碼
驗證碼
使用者名稱
密碼
手機號碼
驗證碼
①當用戶輸入
手機號碼
時,只要驗證碼
不為空就可以請求登入介面了。使用者名稱
密碼
②當用戶輸入
使用者名稱
時,只要密碼
不為空就可以請求登入介面了。那我們要怎麼做呢?這下子就會用到Plan這個欄位了,請看程式碼
@ValidateNull(id = R.id.et_phoneNo,toast = "手機號碼不能為空",plan = Plan.A) EditText et_phoneNo; @ValidateNull(id = R.id.et_checkNo,toast = "手機驗證碼不能為空",plan = Plan.A) EditText et_checkNo; @ValidateNull(id = R.id.et_userName,toast = "手機使用者名稱不能為空",plan = Plan.B) EditText et_userName; @ValidateNull(id = R.id.et_pw,toast = "手機密碼不能為空",plan = Plan.B) EditText et_pw;
在呼叫時分別傳入Plan即可
if(!IVALIDATE.isValidatePass(Plan.A)){ //Todo 驗證不通過 return; }
if(!IVALIDATE.isValidatePass(Plan.B)){ //Todo 驗證不通過 return; }
- 那當我需求中的判斷都需要用到這個控制元件去判斷可咋辦呢?
@ValidateNull(id = R.id.et_pw,toast = "手機密碼不能為空",plan = {Plan.A, Plan.B}) EditText et_pw;
plan = {Plan.A, Plan.B}
就這麼簡單,我既參加計劃A的校驗,也參加計劃B的校驗,這下可沒毛病了吧!
使用的注意事項
-
元件化
開發時要配合Butternife使用,我懶得去生成R2檔案了,畢竟重複造輪子沒意義是吧。
結言
嗯。。。效果圖我就不發了。就這樣子吧。實現的原理大部分來源於Butternife,啊哈哈哈。以上,這是我的第一篇部落格,算是對自己辛苦成果的獎勵吧。。。。拜!
GitHub/">GitHub地址: ofollow,noindex">https://github.com/EiuaLee/EasyValidate