Form Validation est le processus de vérification de tous les champs d'un formulaire pour s'assurer de leur exactitude avant d'envoyer les données au serveur. Contrairement à la validation d'un champ individuel, Form Validation prend en compte les relations entre les champs : confirmation du mot de passe, dépendance d'un champ par rapport à un autre, obligation conditionnelle. Selon Google Developers, 2026, Form Validation doit vérifier l'ensemble du formulaire lors de la soumission et fournir à l'utilisateur un récapitulatif de toutes les erreurs. Une validation correcte du formulaire augmente la conversion d'inscription de 25 à 35 % et réduit le nombre d'erreurs de saisie.
Points essentiels
Form Validation est un processus qui garantit que toutes les données saisies par l'utilisateur dans un formulaire répondent aux exigences métier avant d'être envoyées au serveur. La validation de formulaire inclut la vérification de chaque champ individuellement, ainsi que des vérifications croisées : si le mot de passe correspond à la confirmation, si au moins une case à cocher est sélectionnée, si tous les champs obligatoires sont remplis, si la date est correcte (par exemple, la date de naissance n'est pas dans le futur).
La différence avec la validation simple de champ est que Form Validation opère sur le formulaire comme un tout. Elle peut bloquer l'envoi si un champ conditionnel n'est pas rempli, ou afficher un récapitulatif des erreurs dans une fenêtre de dialogue. Dans les formulaires complexes (inscription, processus de commande, questionnaires), la validation de formulaire est une couche de logique distincte qui est testée indépendamment de l'interface utilisateur.
Selon les recherches UX de NN Group, les utilisateurs remplissent un formulaire 3 fois plus souvent s'ils voient les erreurs immédiatement après la soumission, plutôt qu'après chaque champ individuellement. Cependant, le meilleur résultat provient d'une combinaison : validation instantanée des champs simples (longueur, format) + vérification complète à la soumission pour les champs croisés et la logique métier.
La validation de champ répond à la question : la saisie dans ce champ particulier est-elle correcte ? L'e-mail a le format user@domain.com, le téléphone se compose de chiffres, le mot de passe fait plus de 6 caractères. La validation de champ est isolée — elle ne dépend pas des autres champs et peut être effectuée en temps réel. Résultat : une erreur pour un champ spécifique ou absence d'erreur.
La validation de formulaire répond à la question : le formulaire peut-il être envoyé dans son ensemble ? Elle prend en compte non seulement chaque champ mais aussi leurs combinaisons : le mot de passe et la confirmation doivent correspondre, la date de début ne peut pas être postérieure à la date de fin, la somme des champs doit être égale à 100 %. La validation de formulaire est effectuée à la soumission et retourne un résultat global : le formulaire est valide ou non.
Architecturalement, la validation de champ est placée dans la couche UI (fragment, ViewModel), tandis que la validation de formulaire est placée dans la couche domaine (use case, interactor). Cela permet de réutiliser la validation de formulaire dans différents composants UI et de la tester sans émulateur. En Clean Architecture, la validation de formulaire est une règle métier, pas une logique UI.
| Critère | Validation de champ | Validation de formulaire |
|---|---|---|
| Objet de vérification | Un champ | Tous les champs + leurs relations |
| Moment d'exécution | Temps réel / à la perte de focus | Lors de la soumission du formulaire |
| Résultat | Erreur d'un champ spécifique | Statut global du formulaire + liste d'erreurs |
| Couche d'architecture | Couche UI | Couche domaine |
Il existe deux approches principales pour Form Validation. La première est impérative : le développeur écrit une fonction qui vérifie séquentiellement chaque champ et collecte une liste d'erreurs. Cette approche est simple à comprendre, mais le code croît avec chaque nouveau champ. Pour un formulaire avec 5 champs, l'approche impérative est encore pratique ; pour 15 champs, elle devient problématique.
La deuxième approche est déclarative : les règles de validation sont décrites par des annotations ou une configuration. La bibliothèque elle-même parcourt tous les champs, applique les règles et retourne le résultat. Exemple : l'annotation @Email sur le champ emailData, @ConfirmPassword sur le champ de confirmation. L'approche déclarative réduit le code de validation de 3 à 5 fois et le rend lisible.
La troisième approche est réactive utilisant RxJava ou Kotlin Flow. Chaque champ est représenté comme un Observable ou StateFlow. La validation de formulaire s'abonne aux changements de tous les champs et recalcule l'état général à chaque modification. Le bouton d'envoi devient automatiquement actif lorsque tous les champs sont valides. Cette approche nécessite une compréhension de la programmation réactive, mais offre la meilleure expérience utilisateur.
Considérons un formulaire d'inscription avec trois champs : email, mot de passe et confirmation du mot de passe. La validation du formulaire inclut : la vérification de l'email via Patterns.EMAIL_ADDRESS, la vérification que le mot de passe a une longueur minimale de 8 caractères et contienne au moins un chiffre, la vérification que le mot de passe et la confirmation correspondent. Ce n'est que lorsque les trois vérifications sont réussies que le formulaire peut être envoyé.
data class RegistrationForm(
val email: String,
val password: String,
val confirmPassword: String
)
fun validateRegistration(form: RegistrationForm): ValidationResult {
if (!Patterns.EMAIL_ADDRESS.matcher(form.email).matches())
return ValidationResult(false, "Invalid email address")
if (form.password.length < 8)
return ValidationResult(false, "Password too short")
if (form.password != form.confirmPassword)
return ValidationResult(false, "Passwords do not match")
return ValidationResult(true)
}
Dans l'exemple, validateRegistration prend une classe de données du formulaire et retourne un ValidationResult. Si au moins une vérification échoue, elle retourne false avec un message correspondant. La gestion du bouton d'envoi est basée sur le Result : si isValid = true, le bouton est actif. Pour mettre à jour l'état en temps réel, on peut utiliser LiveData
L'approche réactive avec Kotlin Flow permet de recalculer automatiquement l'état du formulaire. Chaque champ est représenté comme MutableStateFlow
Android Saripaar est la bibliothèque de validation la plus populaire pour Android. Elle permet d'annoter directement les champs et les vues : @Email, @NotEmpty, @Password(min = 8, scheme = Password.Scheme.ALPHA_NUMERIC). La validation est déclenchée par une seule ligne validator.validate() avec un callback. Saripaar définit automatiquement l'erreur via setError sur EditText. La bibliothèque prend également en charge les annotations personnalisées pour des règles métier spécifiques.
RxBinding + RxJava est une approche réactive sans bibliothèque de validation séparée. Chaque champ publie les modifications via RxTextView.textChanges(). L'opérateur combineLatest fusionne tous les champs et calcule le statut global. Avantage : contrôle total sur le pipeline de validation, possibilité d'ajouter debounce, throttle, filter. Inconvénient : nécessite une connaissance de RxJava.
Material Design Components offrent un support intégré pour TextInputLayout et TextInputEditText. La bibliothèque ne fournit pas la validation en tant que telle, mais donne une interface utilisateur pour afficher les erreurs : setError(), setHelperText(), setCounterEnabled(). Pour la validation elle-même, une logique manuelle ou Saripaar est toujours nécessaire. Les Material Components sont responsables de l'affichage, pas de la vérification.
La première erreur est la validation côté client uniquement. Form Validation côté client est destinée à l'expérience utilisateur, pas à la sécurité. Un attaquant peut envoyer une requête directement à l'API, contournant la validation. Le serveur doit vérifier à nouveau tous les champs. La validation côté client ne doit pas être la seule protection — c'est une couche supplémentaire pour le confort de l'utilisateur, pas pour la sécurité des données.
La deuxième erreur est le blocage du bouton d'envoi sans messages. Si le bouton est inactif, l'utilisateur doit voir quels champs doivent être corrigés. Un bouton gris sans explication est l'une des causes les plus fréquentes de faible conversion des formulaires. Affichez toujours les erreurs des champs à côté d'eux, même si le bouton est désactivé. L'utilisateur doit comprendre ce qui empêche exactement l'envoi.
La troisième erreur est l'ignorance des vérifications croisées. Valider chaque champ individuellement est insuffisant. Les champs peuvent dépendre les uns des autres : mot de passe et confirmation, date de début et date de fin, pays et ville. Form Validation doit vérifier ces relations. Vérifier uniquement des champs individuels crée un faux sentiment de sécurité — le formulaire pourrait être envoyé avec des données incohérentes.
| Erreur | Conséquence | Solution |
|---|---|---|
| Validation côté client uniquement | Vulnérabilité de sécurité | Vérification obligatoire côté serveur |
| Bouton sans messages | Faible conversion du formulaire | Afficher les erreurs des champs |
| Pas de vérifications croisées | Données incohérentes | Valider les relations entre champs |
| Vérifications trop fréquentes | Irritation de l'utilisateur | Debounce et vérification à la perte de focus |
Foire aux questions
La validation de champ vérifie une seule valeur par rapport aux exigences de format ou de longueur. Form Validation vérifie tous les champs ensemble, y compris les vérifications croisées : correspondance des mots de passe, dépendances entre champs. La validation de champ est effectuée dans la couche UI, Form Validation — dans la couche domaine comme règle métier.
Utilisez une approche réactive : combinez tous les champs en un seul Flow ou Observable et abonnez-vous aux changements. À chaque modification d'un champ, recalculez le statut global du formulaire. Si le statut est valide — le bouton est actif. Utilisez Kotlin Flow avec combine ou RxJava avec combineLatest pour des mises à jour automatiques.
Android Saripaar est le meilleur choix pour la validation déclarative avec annotations. Si le projet utilise RxJava — RxBinding fournit une approche réactive sans bibliothèque séparée. Pour les formulaires simples, la validation manuelle avec Patterns et TextUtils sans dépendances externes est suffisante.
Absolument. La validation côté client améliore l'expérience utilisateur mais ne fournit pas de sécurité. Le serveur doit vérifier toutes les données à nouveau car l'API est directement accessible. Ne vous fiez jamais uniquement à la validation côté client pour vous protéger contre des données incorrectes ou malveillantes.
Dans Jetpack Compose, utilisez Kotlin Flow ou StateFlow pour stocker l'état de chaque champ. La fonction de validation prend l'état du formulaire et retourne un ValidationResult. Le bouton d'envoi s'abonne au statut global. Pour afficher les erreurs, utilisez isError dans OutlinedTextField ou TextField de Compose.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi