Validate——是在将数据发送到服务器或在应用程序内部处理之前检查用户输入正确性的过程。在Android中,字段验证包括检查电子邮件格式、电话号码、密码、填写必填项和其他业务规则。根据Material Design Guidelines, 2026,Validate应向用户提供清晰的反馈:错误消息、字段颜色变化、状态图标。正确的验证可将错误表单提交数量减少40-60%,并改善用户体验。
要点
字段验证——是检查用户输入的特定值是否符合既定规则的过程。每个字段都有自己的数据类型:电子邮件、数字、电话、密码、文本。每种类型都有其自己的标准:格式、长度、值范围、必填性。字段验证回答的问题是:此字段中的输入是否正确?
字段验证与表单验证的区别在于,字段独立于其他字段进行检查。电子邮件根据电子邮件模式检查,电话——根据电话模式检查。如果字段无效,用户会看到正是该字段的错误。即使一个字段未通过检查,表单也可能保持未提交状态。字段验证是完整表单验证的构建块。
根据用户体验研究,用户期望在输入完成后不超过1-2秒内看到验证错误。超过3秒的延迟被视为应用程序问题。这就是为什么通过TextWatcher进行的实时验证优于仅在点击发送按钮时检查。
在Android中,字段验证有三种主要方法。第一种——通过条件运算符(if,when)进行手动检查。开发者编写一个接收字符串并返回Boolean或错误消息的函数。这种方法提供了对逻辑的完全控制,但需要为每个字段和每个条件编写代码。
第二种方法——使用Android内置类。例如,Patterns.EMAIL_ADDRESS.matcher(email).matches()根据标准模式检查电子邮件。Patterns.PHONE.matcher(phone).matches()——电话号码。TextUtils.isEmpty()——检查是否为空。这些方法涵盖了基本场景,无需连接外部依赖。
第三种方法——验证库。诸如InputValidator、AndroidValidator或Commons Validator之类的库提供了现成的注解和检查链。开发者声明式地描述规则:@Email、@NotEmpty、@MinLength(6)。库本身执行检查并返回错误列表。这加快了开发速度,但增加了依赖。
| 方法 | 优点 | 缺点 | 何时使用 |
|---|---|---|---|
| 手动检查 | 完全控制,无依赖 | 代码量大,维护困难 | 1-3个字段的简单表单 |
| 内置类 | 快速,标准模式 | 检查集有限 | 标准字段(电子邮件、电话) |
| 库 | 代码最少,声明式方法 | 依赖,自定义困难 | 5+个字段的复杂表单 |
对于电子邮件,标准检查包括存在@符号、域名部分以及没有空格和西里尔字母。Android提供Patterns.EMAIL_ADDRESS,它涵盖了大多数合法的电子邮件地址。然而,如果需要特定检查(例如,仅企业域名),则需要编写自定义正则表达式。电子邮件在输入完成后验证,而不是在每个字符之后。
电话号码根据国家或地区的掩码进行检查。对于国际号码,使用E.164格式:+国家代码、运营商代码、号码。Google的libphonenumber库是电话验证的行业标准。它根据代码确定国家,检查号码的长度和格式。在Android中,您可以使用PhoneNumberUtils.isGlobalPhoneNumber进行基本检查。
密码具有多个复杂性标准:最小长度、存在大写和小写字母、数字、特殊字符。Android中没有用于密码检查的内置类——每个项目确定自己的要求。通常,密码通过正则表达式或一组条件进行检查。重要的是不要在错误消息中透露确切要求:“密码过于简单”比“需要大写字母和数字”更好。
data class ValidationResult(
val isValid: Boolean,
val errorMessage: String? = null
)
fun validatePassword(password: String): ValidationResult {
if (password.length < 6)
return ValidationResult(false, "Minimum 6 characters")
if (!password.any { it.isUpperCase() })
return ValidationResult(false, "Uppercase letter required")
return ValidationResult(true)
}
在示例中,validatePassword返回一个带有isValid字段和可选错误消息的ValidationResult。这种方法便于组合:多个检查按顺序执行,并返回找到的第一个错误。电子邮件和电话的验证基于相同原则构建——每个返回带有消息或成功的结果。
验证时机对用户体验有重大影响。存在三种策略:每个字符后验证(即时)、失去焦点后验证(onFocusLost)和提交表单时验证(onSubmit)。每种策略适用于不同的场景。即时验证适用于具有严格限制的字段——电话号码、PIN码。OnFocusLost——适用于电子邮件和姓名。OnSubmit——适用于必填字段。
根据Material Design Guidelines,建议组合策略:字段应在失去焦点时以及提交表单时进行检查。当限制显而易见时,即时验证是合适的——例如,字段的最大长度。如果对电子邮件在每个字符后都显示错误,用户将在完成输入之前看到消息。这会令人烦恼并降低转化率。
第一个错误规则:提交表单时,仅显示第一个无效字段的错误。不要用10个错误的列表淹没用户。在修复第一个错误后,可以显示下一个错误。这种逐步指导减轻了认知负担,帮助用户更快地填写表单。
Android SDK提供了Validate的基本工具:用于电子邮件和电话的Patterns、用于检查空白的TextUtils、用于任意模式的正则表达式。对于1-3个字段的项目,这足够了。然而,在10+个字段的表单中,手动验证变得难以维护——每个新字段都需要单独的函数和发送逻辑的更新。
流行的验证库:Android Saripaar(@Email、@NotEmpty、@Password注解)、Apache的Commons Validator(检查电子邮件、URL、信用卡号)、用于响应式验证的RxBinding + RxJava。Saripaar允许将注解直接放置在输入字段上,并用一行代码调用验证:validator.validate()。该库通过setError自动显示错误。
Google建议使用带有TextInputLayout的Material Design Components。通过setError、setHelperText和setCounterEnabled的内置验证涵盖了无外部库的基本场景。对于复杂项目(金融科技、医疗),最好使用组合:Material Components + 带有Clean Architecture领域层模式的自定义验证。
第一个错误——在开始输入前显示错误。如果字段是必填的,但用户尚未开始填写,不要显示“字段为必填项”。这会造成虚假的问题感。错误只应在用户与字段交互后才出现:开始输入、离开字段、尝试提交表单。
第二个错误——不明确的错误消息。消息应具体并提示如何解决问题。“无效的电子邮件”——不好。“电子邮件必须包含@和域名,例如user@example.com”——好。用户应理解具体出了什么问题以及如何修复,而无需查阅文档。
第三个错误——无故阻止提交。如果由于验证错误导致提交按钮不可用,用户应看到哪些字段无效。没有消息的灰色按钮对用户来说是死胡同。始终突出显示有错误的字段,并在每个无效字段旁边显示错误文本。
| 错误 | 问题 | 解决方案 |
|---|---|---|
| 输入前错误 | 吓唬用户 | 仅在交互后检查 |
| 不明确的消息 | 用户不理解原因 | 具体描述 + 示例 |
| 灰色按钮 | 无反馈 | 突出显示错误 + 消息 |
| 过度验证 | 规则过于严格 | 安全性和用户体验的平衡 |
常见问题
最佳时机——当字段失去焦点时(onFocusLost)和提交表单时。每个字符后的即时验证仅适用于具有严格限制的字段:长度、数字、特殊字符。对于电子邮件和密码,最好等待用户完成输入并在离开字段后检查。
使用Android SDK中的Patterns.EMAIL_ADDRESS。调用matcher(输入的电子邮件).matches()——如果电子邮件正确,该方法返回true。对于额外检查(阻止临时域名、检查MX记录),需要服务器端验证。在客户端,通过内置模式检查格式就足够了。
使用带有字段注解的验证库,如Saripaar。这将验证代码缩短3-5倍。如果项目使用Clean Architecture,将验证逻辑移至领域层并与UI分开测试。使用带有setError的TextInputLayout显示错误。
必须。客户端验证用于用户体验,服务器验证用于安全。攻击者可以绕过应用程序直接向API发送请求。服务器必须重新检查所有字段。客户端验证不能替代服务器验证,而是为了用户方便而补充它。
使用Material Design Components中的TextInputLayout.setError()。该方法在字段下方显示红色消息并更改边框颜色。替代方案:在字段旁边放置一个单独的TextView用于错误。不要使用Toast或Snackbar显示单个字段的验证错误——用户不会将消息与特定字段关联起来。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。