Error State — o que é, exibição de erros de campo e implementação no Android

Autor: IT Sectr Publicado: 2026-07-09 Tempo de leitura: 5 min

Error State é um estado de campo de entrada que sinaliza visualmente dados inválidos. No Android, o Error State é implementado através de TextInputLayout.setError(), que destaca a borda em vermelho e mostra o texto de erro abaixo do campo. De acordo com Material Design Guidelines, 2026, o Error State deve ser perceptível, mas não agressivo: borda vermelha, texto de erro, ícone. O uso adequado do Error State aumenta a conversão de formulários em 20-30%, pois os usuários detectam e corrigem erros rapidamente sem perder o contexto.

Principais pontos

  • Error State é um estado visual do campo que mostra ao usuário que os dados são inválidos.
  • TextInputLayout.setError() é o método principal para exibir erros no Material Design Components.
  • Indicadores visuais: borda vermelha, texto de erro, ícone de status, animação de aparecimento.
  • Redefinição de erro ocorre automaticamente ao alterar o texto ou manualmente através de setError(null).
  • Error State personalizado é usado quando é necessária uma exibição não padrão: apenas ícone, cor diferente, grupo de campos.

O que é estado de erro de campo no Android?

Error State é um modo de exibição especial de um campo de entrada que é ativado quando os dados inseridos falham na validação. Visualmente, o Error State inclui três componentes: uma mudança na cor da borda ou fundo do campo (geralmente para vermelho), o aparecimento de uma mensagem de texto abaixo do campo descrevendo o erro e, opcionalmente, um ícone ou destaque. O objetivo do Error State é atrair instantaneamente a atenção do usuário para o campo problemático e sugerir como corrigir o erro.

No Android, o Error State é implementado no nível do TextInputLayout do Material Design Components. O TextInputLayout envolve o EditText e gerencia seus estados: normal, focused, error, disabled. O método setError(String) alterna o campo para o estado de erro, altera a cor da borda e exibe a mensagem. Quando o texto muda ou setError(null) é chamado, o campo retorna ao normal.

De acordo com as Material Design Guidelines, o Error State deve ser perceptível, mas não dominante. A cor vermelha da borda deve contrastar com o estado normal, mas não sobrecarregar a interface. A mensagem de erro deve conter informações específicas sobre o problema e como resolvê-lo. Um ícone de erro (por exemplo, um círculo vermelho com um ponto de exclamação) reforça o sinal visual.

Como o setError funciona no TextInputLayout

O método setError(CharSequence errorText) alterna o TextInputLayout para o estado de erro. O parâmetro errorText é o texto exibido abaixo do campo. Se null for passado, o erro é limpo. O TextInputLayout gerencia a animação: o texto de erro aparece com um fade-in suave, a borda muda para vermelho. Um ícone de erro (padrão: ponto de exclamação em um círculo) é mostrado no final do campo.

Detalhes importantes: setErrorEnabled(true) deve ser chamado antes de setError para reservar espaço para a mensagem de erro. Caso contrário, o layout pode "pular" quando o erro aparecer porque o espaço não está reservado. Recomenda-se sempre ativar o suporte a erro no XML através de app:errorEnabled="true" para evitar deslocamentos do layout.

O método setError é limpo automaticamente quando o texto do campo muda se setErrorEnabled(true) estiver ativado. Esse comportamento é conveniente para validação em tempo real: assim que o usuário começa a corrigir o erro, a borda vermelha desaparece e o campo retorna ao normal. No entanto, para cenários complexos, essa limpeza automática pode ser indesejável — nesses casos, gerencie o erro manualmente.

kotlin
val til = findViewById<TextInputLayout>(R.id.til_email)

// Ativar suporte a erro (definir em XML caso contrário)
til.isErrorEnabled = true

// Definir mensagem de erro
til.error = "Invalid email address"

// Limpar erro
til.error = null

// Verificar se o erro existe
if (til.error != null) {
    // O campo está em estado de erro
}

O exemplo usa propriedades do Kotlin para acessar setError/isErrorEnabled. O TextInputLayout atualiza automaticamente a interface: altera o boxStrokeColor, mostra o ícone de erro, exibe o texto de erro. Se o texto no EditText mudar, o erro é limpo automaticamente. Para redefinição manual, defina error = null.

Formas alternativas de exibir erros

Nem todos os projetos usam Material Design Components. Para exibição personalizada de erros, você pode usar um TextView separado abaixo do EditText que se torna visível ao ocorrer um erro. Essa abordagem oferece controle total sobre estilos e posicionamento da mensagem. Por exemplo, você pode colocar a mensagem à direita do campo, usar uma cor de fundo diferente ou adicionar um ícone à esquerda do texto.

No Jetpack Compose, o Error State é implementado através do parâmetro isError no OutlinedTextField ou TextField. Quando isError = true, a borda fica vermelha e você pode mostrar o texto de erro através do supportingText. O Compose não possui limpeza automática interna ao alterar o texto — o desenvolvedor gerencia o estado de erro manualmente usando remember e mutableStateOf.

Para erros de grupo (uma única mensagem para vários campos, por exemplo, "Preencha todos os campos obrigatórios"), use Snackbar, Dialog ou um bloco inline no topo do formulário. Um erro de grupo não substitui o Error State de campos individuais, mas o complementa. O usuário primeiro vê a mensagem geral e depois procura campos específicos com erros.

MétodoPrósContrasQuando usar
TextInputLayout.setErrorPadrão, animação, limpeza automáticaApenas com Material ComponentsOpção principal para MDC
TextView separadoControle total de estilosGerenciamento manual de visibilidadeTemas personalizados, sem MDC
Compose isErrorIntegrado ao ComposeGerenciamento manual de estadoProjetos Jetpack Compose
Snackbar/DialogMensagem em grupoNão vinculado a um campo específicoComplemento ao Error State do campo

Cores, ícones e animação de erros

A cor do Error State no Material Design Components é controlada através do atributo boxStrokeErrorColor ou do atributo colorError no tema. Por padrão, a cor vermelha do sistema é usada, mas pode ser substituída no tema do aplicativo ou diretamente no TextInputLayout através de app:boxStrokeErrorColor="@color/customErrorColor". Para suporte a tema escuro, recomenda-se usar um seletor com cores diferentes para os modos claro e escuro.

Ícone de erro é configurado através de app:errorIconDrawable. Por padrão, um ponto de exclamação em um círculo é exibido. Pode ser substituído por um ícone personalizado ou removido completamente definindo app:errorIconDrawable="@null". O ícone é exibido no final do TextInputLayout e serve como um marcador visual adicional. No Material Design 3, o ícone de erro é obrigatório para acessibilidade.

Animação de aparecimento do erro é integrada ao TextInputLayout: o texto desliza de baixo para cima com uma mudança suave de opacidade. Para animação personalizada, use a Transition API ou MotionLayout. Por exemplo, agitar o campo ao ocorrer um erro atrai atenção adicional. No entanto, o uso excessivo de animação prejudica a UX — o aparecimento suave da mensagem é suficiente.

Gerenciamento do estado de erro durante a validação

O gerenciamento do Error State é dividido em duas etapas: definir o erro durante a validação do campo e limpar o erro ao corrigir. No caso mais simples, a validação é chamada em TextWatcher.afterTextChanged: se o valor for inválido, setError é chamado com uma mensagem de erro. Se for válido, setError(null) é chamado. O TextInputLayout oculta automaticamente o erro quando setError(null) limpa o estado.

Para validação de formulário, os erros são definidos na etapa de envio do formulário. Percorra todos os campos, valide cada um, defina erros para campos inválidos e foque no primeiro campo com erro. O botão de envio é bloqueado durante esse processo. Se o formulário for grande, recomenda-se rolar para o primeiro campo com erro e definir o foco automaticamente.

A regra de foco único de erro: ao enviar um formulário, defina o foco apenas no primeiro campo com erro. O usuário corrige um erro de cada vez e, após a correção, o próximo campo com erro recebe o foco automaticamente. Essa abordagem passo a passo reduz a carga cognitiva. O Material TextInputLayout não intercepta o foco ao definir um erro — isso deve ser feito manualmente através de requestFocus().

Erros comuns ao trabalhar com Error State

O primeiro erro — falta de isErrorEnabled. Se setErrorEnabled não for chamado antes de setError, o layout pode se deslocar quando a mensagem de erro aparecer. Isso é especialmente crítico se o campo estiver no meio da tela — o usuário perde a posição de rolagem. Sempre ative setErrorEnabled(true) no XML através de app:errorEnabled="true" ou programaticamente antes de definir um erro.

O segundo erro — mensagem de erro muito longa. O texto longo é dividido em várias linhas e pode sobrepor campos vizinhos. O comprimento recomendado da mensagem de erro é de 20 a 40 caracteres. Se mais informações forem necessárias, use helperText no estado normal ou uma dica de ferramenta para explicação adicional. A brevidade é a base de um bom Error State.

O terceiro erro — ignorar a acessibilidade. O Error State deve ser acessível para leitores de tela. O TextInputLayout anuncia automaticamente o erro através de contentDescription, mas implementações personalizadas devem fazer isso manualmente. Use announceForAccessibility() ou android:importantForAccessibility para mensagens de erro. Os usuários do TalkBack devem ouvir o erro imediatamente após seu aparecimento.

ErroProblemaSolução
Sem isErrorEnabledDeslocamento do layout ao ocorrer erroapp:errorEnabled="true" no XML
Mensagem longaSobreposição de campos vizinhos20-40 caracteres, helperText para detalhes
Sem acessibilidadeLeitor de tela não ouve o erroImportante para usuários TalkBack
Limpeza automática sem verificaçãoCampo considerado válido incorretamenteGerenciamento manual de redefinição de erro

Perguntas frequentes

Como redefinir o Error State ao corrigir um erro?

Se estiver usando TextInputLayout, chame setError(null). Ative setErrorEnabled(true) para que o espaço abaixo da mensagem permaneça reservado, mas o texto desapareça. Quando o texto no EditText muda, o TextInputLayout limpa automaticamente o erro. Para controle manual, use addTextChangedListener e setError(null) em cada alteração.

Por que o layout se desloca quando um erro aparece?

Porque o espaço para a mensagem de erro não está reservado. Solução: ative app:errorEnabled="true" no XML para TextInputLayout. Isso reserva espaço para a mensagem e o layout não se deslocará. Quando o erro está inativo, o espaço permanece vazio, mas o layout é estável.

Como alterar a cor do erro no TextInputLayout?

Use o atributo app:boxStrokeErrorColor no XML ou programaticamente através de til.setBoxStrokeErrorStateList(). A cor pode ser definida com um seletor para diferentes estados. Você também pode substituir o atributo de sistema colorError no tema do aplicativo para alterar a cor do erro globalmente para todos os campos.

Posso mostrar um erro sem alterar a cor da borda?

Sim, use app:errorEnabled="true" e setError() — mas substitua boxStrokeErrorColor pela cor padrão do campo. O ícone e o texto de erro ainda ficarão visíveis, mas a borda permanecerá na cor original. No entanto, isso reduz a visibilidade do erro, o que contradiz as recomendações de acessibilidade do Material Design.

Como implementar Error State no Jetpack Compose?

No Compose, use isError = true no OutlinedTextField ou TextField. O texto de erro é passado através do parâmetro supportingText. Gerencie o estado com mutableStateOf. Limpe isError manualmente quando o texto mudar. O Compose não possui limpeza automática de erros, ao contrário do TextInputLayout no sistema View.

Resumo

  • Error State — um estado visual do campo que sinaliza um erro através de borda vermelha, texto e ícone.
  • TextInputLayout.setError() — o método principal para gerenciar Error State no Material Design Components.
  • isErrorEnabled deve estar ativado para evitar deslocamento do layout quando um erro aparecer.
  • Métodos alternativos: TextView separado para erros, Snackbar para erros de grupo, Compose isError.
  • Cor e ícone do erro são configurados através de boxStrokeErrorColor e errorIconDrawable.
  • Acessibilidade é obrigatória: o leitor de tela deve anunciar o erro quando ele aparecer.
  • Gerenciamento de erro durante a validação: definir em valor inválido, limpar ao corrigir ou manualmente.

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.

Discutir o projeto

Leia também