写这篇文章的原因

在移动端一般很少使用复杂的表单,一般针对于属性的更改都会打开一个新的页面进行更改。虽然不多,但是也会有。如果一个页面要输入的内容包括姓名、地址、邮箱、手机号等,对各个属性的验证会非常麻烦,并且非常的不优雅。

于是,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:错误提示文字的资源文件ID
  • message:错误提示文字

    注:所有注解均有这三个参数,故之后注解省略不写

@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:最小字符数,默认为6
  • scheme: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实现的细节。

Android Saripaar 注解详解的更多相关文章

  1. android:ToolBar详解

    android:ToolBar详解(手把手教程) 泡在网上的日子 发表于 2014-11-18 12:49 第 124857 次阅读 ToolBar 42 来源 http://blog.mosil.b ...

  2. Android之canvas详解

    首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...

  3. 【转】Android Canvas绘图详解(图文)

    转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...

  4. Android 核心分析 之八Android 启动过程详解

    Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...

  5. Android GLSurfaceView用法详解(二)

    输入如何处理       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...

  6. Android编译过程详解(一)

    Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...

  7. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  8. Android.mk文件详解(转)

    源:Android.mk文件详解 从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解.了解了标准的Makefile后,发现Android.mk其实是把真 ...

  9. Android Studio 插件开发详解四:填坑

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78265540 本文出自[赵彦军的博客] 在前面我介绍了插件开发的基本流程 [And ...

随机推荐

  1. httprunner-2-linux下搭建hrun(下)

    前言 前面我们说了linux下安装python3,hrun是需要依赖数据库,我们用docker进行安装mysql5.7让数据库能正常连接.安装mysql5.7请参考:https://www.cnblo ...

  2. Java中数组操作 java.util.Arrays 类常用方法的使用

    任何一门编程语言,数组都是最重要和常用的数据结构之一,但不同的语言对数组的构造与处理是不尽相同的. Java中提供了java.util.Arrays 类能方便地操作数组,并且它提供的所有方法都是静态的 ...

  3. Vim任意代码执行漏洞(CVE-2019-12735)

    Vim通过Modelines执行任意代码 漏洞概要: 在8.1.1365之前的Vim和在0.3.6之前的Neovim很容易通过打开特制的文本文件而通过模型执行任意代码. 复现条件: 确保未禁用mode ...

  4. 关于B/S模式CGI上传文件,遇到的问题归纳(待更新。。。)

    由于项目问题是基于web的,最近一直在改进web界面,由于产品需要升级,而且升级操作是由客户在web端完成,将软件包放在本地,由web上传到后台完成更新,之前做的是TFTP更新方式,但是需要借助第三方 ...

  5. Django学习day7——简单的使用数据库和模型

    Django支持的数据库 PostgreSQL SQLite 3 MySQL Oracle 其中SQLite 3不需要安装,因为SQLite使用文件系统上的独立文件来存储数据 这里我们用SQLite ...

  6. CSPS模拟99

    555我原型笔录 T1 不会线段树维护单调栈被dalao们踩爆 T2 我要实现这样一个东西: 已知a,b,c,使a=a-b,b=b-c 结果我把代码弄成这样: b=b-c;a=a-b; 然后就被dal ...

  7. ftp工具无法连接到Linux服务器

    ftp工具无法连接Linux服务器,文件无法上传,是因为你的ftp服务器未搭建(或未启动) 许久没有登录腾讯云,今天想用xshell的xftp工具上传文件,却突然出现连接不上. 用22端口,可以正常登 ...

  8. Vue基础系列(四)——Vue中的指令(上)

    写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. VUE基础系列目录 < ...

  9. Md5实例

    MD5实例 我的md5源码 当我们对数据进行操作时,存储到数据库时,有时候不希望别人能够看到,通过md5能够实现对数据的加密. java代码 ```javaimport org.springframe ...

  10. 初识web API接口及Restful接口规范

    一.web API接口 什么是web API接口?: 明确了请求方式,提供对应后台所需参数,请求url链接可以得到后台的响应数据 url : 返回数据的url https://api.map.baid ...