Validate é o processo de verificar a entrada do usuário quanto à correção antes de enviar os dados ao servidor ou processá-los dentro do aplicativo. No Android, a validação de campos inclui a verificação do formato do email, número de telefone, senha, campos obrigatórios e outras regras de negócio. De acordo com as Material Design Guidelines, 2026, o Validate deve fornecer ao usuário um feedback claro: uma mensagem de erro, mudança de cor do campo, ícone de status. A validação correta reduz o número de envios errôneos de formulários em 40-60% e melhora a experiência do usuário.
Principais pontos
A validação de campo é a verificação de um único valor inserido pelo usuário de acordo com as regras especificadas. Cada campo tem seu próprio tipo de dados: email, número, telefone, senha, texto. Cada tipo tem seus próprios critérios: formato, comprimento, intervalo de valores, obrigatoriedade. A validação de campo responde à pergunta: a entrada neste campo está correta?
A diferença entre validação de campo e validação de formulário é que um campo é verificado independentemente dos outros campos. O email é validado contra um padrão de email, o telefone contra um padrão de telefone. Se um campo é inválido, o usuário vê um erro para esse campo específico. O formulário pode permanecer não enviado mesmo se um campo falhar na validação. A validação de campo é o bloco de construção para a validação completa do formulário.
De acordo com pesquisas de UX, os usuários esperam ver um erro de validação no máximo 1-2 segundos após concluir a entrada. Um atraso de mais de 3 segundos é percebido como um problema do aplicativo. É por isso que a validação em tempo real via TextWatcher é preferível a verificar apenas quando o botão de envio é pressionado.
Existem três abordagens principais para validação de campos no Android. A primeira é a verificação manual através de operadores condicionais (if, when). O desenvolvedor escreve uma função que recebe uma string e retorna um Boolean ou uma mensagem de erro. Essa abordagem dá controle total sobre a lógica, mas requer escrever código para cada campo e cada condição.
A segunda abordagem é usar classes integradas do Android. Por exemplo, Patterns.EMAIL_ADDRESS.matcher(email).matches() valida um email contra um padrão padrão. Patterns.PHONE.matcher(phone).matches() valida um número de telefone. TextUtils.isEmpty() verifica se está vazio. Esses métodos cobrem cenários básicos sem adicionar dependências externas.
A terceira abordagem são bibliotecas de validação. Bibliotecas como InputValidator, AndroidValidator ou Commons Validator fornecem anotações prontas e cadeias de validação. O desenvolvedor descreve as regras declarativamente: @Email, @NotEmpty, @MinLength(6). A própria biblioteca realiza a validação e retorna uma lista de erros. Isso acelera o desenvolvimento, mas adiciona uma dependência.
| Método | Prós | Contras | Quando usar |
|---|---|---|---|
| Verificação manual | Controle total, sem dependências | Muito código, complexidade de manutenção | Formulários simples com 1-3 campos |
| Classes integradas | Rápido, padrões padrão | Conjunto limitado de verificações | Campos padrão (email, telefone) |
| Bibliotecas | Mínimo código, abordagem declarativa | Dependência, complexidade de personalização | Formulários complexos com 5+ campos |
Para email, a validação padrão inclui verificar a presença do símbolo @, uma parte de domínio e a ausência de espaços e caracteres cirílicos. O Android fornece Patterns.EMAIL_ADDRESS, que cobre a maioria dos endereços de email legítimos. No entanto, se for necessária uma validação específica (por exemplo, apenas domínios corporativos), uma regex personalizada deve ser escrita. O email é validado após a conclusão da entrada, não após cada caractere.
O número de telefone é validado contra uma máscara de país ou região. Para números internacionais, o formato E.164 é usado: +código do país, código da operadora, número. A biblioteca libphonenumber do Google é o padrão da indústria para validação de telefones. Ela determina o país pelo código, verifica o comprimento e o formato do número. No Android, PhoneNumberUtils.isGlobalPhoneNumber pode ser usado para validação básica.
A senha tem vários critérios de complexidade: comprimento mínimo, presença de letras maiúsculas e minúsculas, dígitos, caracteres especiais. O Android não tem uma classe integrada para validação de senha — cada projeto define seus próprios requisitos. Normalmente, uma senha é validada através de uma expressão regular ou um conjunto de condições. É importante não revelar requisitos exatos na mensagem de erro: “A senha é muito simples” é melhor do que “É necessária uma letra maiúscula e um dígito”.
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)
}
No exemplo, validatePassword retorna um ValidationResult com um campo isValid e uma mensagem de erro opcional. Esta abordagem é conveniente para composição: várias verificações são executadas sequencialmente e o primeiro erro encontrado é retornado. A validação de email e telefone segue o mesmo princípio — cada uma retorna um resultado com uma mensagem ou sucesso.
O momento da validação afeta criticamente a UX. Existem três estratégias: validação após cada caractere (instantânea), após perder o foco (onFocusLost) e no envio do formulário (onSubmit). Cada estratégia é adequada para diferentes cenários. A validação instantânea é boa para campos com restrições estritas — número de telefone, código PIN. OnFocusLost funciona para email e nome. OnSubmit funciona para campos obrigatórios.
De acordo com as Material Design Guidelines, é recomendado combinar estratégias: um campo deve ser validado ao perder o foco e também ao enviar o formulário. A validação instantânea é apropriada quando a restrição é óbvia — por exemplo, comprimento máximo do campo. Se um erro for mostrado após cada caractere para email, o usuário verá uma mensagem antes de terminar a entrada. Isso é irritante e reduz a conversão.
A regra do primeiro erro: ao enviar um formulário, mostre um erro apenas para o primeiro campo inválido. Não sobrecarregue o usuário com uma lista de 10 erros. Após corrigir o primeiro erro, o próximo pode ser mostrado. Esta orientação passo a passo reduz a carga cognitiva e ajuda o usuário a preencher o formulário mais rapidamente.
O SDK do Android fornece ferramentas básicas para Validate: Patterns para email e telefone, TextUtils para verificar vazio, expressões regulares para padrões arbitrários. Para projetos com 1-3 campos, isso é suficiente. No entanto, em formulários com 10+ campos, a validação manual se torna difícil de manter — cada novo campo requer uma função separada e lógica de envio atualizada.
Bibliotecas de validação populares: Android Saripaar (anotações @Email, @NotEmpty, @Password), Apache Commons Validator (validação de email, URL, número de cartão de crédito), RxBinding + RxJava para validação reativa. Saripaar permite colocar anotações diretamente nos campos de entrada e chamar a validação com uma linha: validator.validate(). A biblioteca mostra automaticamente os erros através de setError.
O Google recomenda usar Material Design Components com TextInputLayout. A validação integrada através de setError, setHelperText e setCounterEnabled cobre cenários básicos sem bibliotecas de terceiros. Para projetos complexos (fintech, saúde), é melhor usar uma combinação: Material Components + validação personalizada com padrões da camada de domínio da Clean Architecture.
O primeiro erro é mostrar um erro antes do início da entrada. Se um campo é obrigatório mas o usuário não começou a preenchê-lo, não mostre “Campo obrigatório”. Isso cria uma falsa sensação de problema. Um erro deve aparecer apenas depois que o usuário interagiu com o campo: começou a digitar, saiu do campo, tentou enviar o formulário.
O segundo erro é uma mensagem de erro pouco clara. A mensagem deve ser específica e sugerir como corrigir o problema. “Email inválido” é ruim. “O email deve conter @ e um domínio, por exemplo user@example.com” é bom. O usuário deve entender exatamente o que está errado e como corrigir sem consultar a documentação.
O terceiro erro é bloquear o envio sem explicação. Se o botão de envio estiver inativo devido a erros de validação, o usuário deve ver quais campos são inválidos. Um botão cinza sem mensagens é um beco sem saída para o usuário. Sempre destaque os campos com erros e mostre o texto do erro ao lado de cada campo inválido.
| Erro | Problema | Solução |
|---|---|---|
| Erro antes da entrada | Assusta o usuário | Validar apenas após interação |
| Mensagem pouco clara | Usuário não entende o motivo | Descrição específica + exemplo |
| Botão cinza | Sem feedback | Destacar erros + mostrar mensagem |
| Validação excessiva | Regras muito rigorosas | Equilíbrio entre segurança e UX |
Perguntas frequentes
O momento ideal é quando o campo perde o foco (onFocusLost) e ao enviar o formulário. A validação instantânea após cada caractere é adequada apenas para campos com restrições estritas: comprimento, dígitos, caracteres especiais. Para email e senha, é melhor esperar o usuário terminar a entrada e validar após sair do campo.
Use Patterns.EMAIL_ADDRESS do SDK do Android. Chame matcher(emailInserido).matches() — o método retorna true se o email for válido. Para verificações adicionais (bloqueio de domínios temporários, verificação de registros MX), é necessária validação no servidor. No lado do cliente, basta verificar o formato através do padrão integrado.
Use uma biblioteca de validação como Saripaar com anotações nos campos. Isso reduzirá o código de validação em 3-5 vezes. Se o projeto usar Clean Architecture, mova a lógica de validação para a camada de domínio e teste-a separadamente da UI. Use TextInputLayout com setError para exibir erros.
Absolutamente. A validação do lado do cliente é para UX, a do servidor é para segurança. Um invasor pode enviar uma solicitação diretamente à API, ignorando o aplicativo. O servidor deve revalidar todos os campos. A validação do lado do cliente não substitui a validação do servidor, mas a complementa para conveniência do usuário.
Use TextInputLayout.setError() do Material Design Components. O método mostra uma mensagem vermelha abaixo do campo e altera a cor da borda. Alternativa: um TextView separado para o erro ao lado do campo. Não use Toast ou Snackbar para erros de validação de campos individuais — o usuário não associará a mensagem a um campo específico.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também