TextInputLayout est un composant de la bibliothèque Material Components pour Android qui encapsule un EditText et ajoute des capacités avancées de saisie de texte. La fonction principale de TextInputLayout est l'étiquette flottante (floating label), qui s'élève au-dessus du champ lors de la saisie de texte, économisant de l'espace et améliorant la lisibilité. De plus, le composant prend en charge l'affichage des messages d'erreur, des icônes dans le champ, un compteur de caractères et divers styles de présentation. Selon les Material Design Guidelines (2025), TextInputLayout est la méthode recommandée pour créer des champs de texte dans les applications Android conformes aux normes Material Design 3.
Points clés
TextInputLayout est un ViewGroup du package com.google.android.material.textfield qui étend LinearLayout et contient un EditText à l'intérieur. Le composant fait partie de la bibliothèque Material Components pour Android, à partir de la version 1.0.0. L'objectif principal de TextInputLayout est de fournir une implémentation prête à l'emploi des champs de texte Material Design avec un minimum d'effort de la part du développeur.
Contrairement à un EditText standard, TextInputLayout gère l'animation de l'étiquette flottante, qui est définie via l'attribut android:hint de l'EditText interne. Lorsque le champ est vide, l'étiquette s'affiche à l'intérieur du champ comme une indication normale. Dès que l'utilisateur commence à saisir, l'étiquette se déplace de manière animée vers le haut du champ, en réduisant sa taille. Selon les Material Design Guidelines (2025), cette animation améliore la perception du formulaire car l'utilisateur voit toujours le nom du champ, même après avoir saisi des données.
Architecturalement, TextInputLayout implémente le modèle décorateur : il intercepte les événements d'EditText, gère l'affichage des éléments supplémentaires (étiquette, erreur, icônes, compteur) et coordonne leur animation. L'EditText interne est accessible via la méthode getEditText() et peut être configuré avec des attributs standard, notamment inputType, maxLines et hint.
<!-- Basic TextInputLayout markup -->
@+id/tilEmail
android:layout_width="match_parent"
android:layout_height="wrap_content">
@+id/etEmail
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
L'étiquette flottante (floating label) est la fonctionnalité clé de TextInputLayout. Lorsque le champ est vide, le texte de android:hint s'affiche dans l'EditText comme un espace réservé normal. Lorsque le champ reçoit le focus ou que du texte est saisi, l'étiquette s'élève vers le haut de TextInputLayout, réduisant la taille de la police et changeant de couleur. Ce comportement résout le problème de l'indication devenant invisible après que l'utilisateur a commencé à saisir.
La configuration de l'étiquette flottante se fait via les attributs de TextInputLayout : app:hintEnabled détermine si l'étiquette flottante est activée (par défaut true), app:hintAnimationEnabled active ou désactive l'animation de transition, app:expandedHintEnabled permet d'afficher l'étiquette même lorsque le champ est vide et sans focus. La couleur de l'étiquette dans différents états est gérée via les styles colorPrimary et colorControlHighlight.
Selon l'équipe Google Material Components (2025), l'étiquette flottante est particulièrement utile dans les formulaires comportant de nombreux champs, où l'utilisateur pourrait oublier le nom du champ après avoir commencé à saisir. Contrairement à un simple android:hint qui disparaît à la saisie, l'étiquette flottante reste visible en permanence, fournissant un contexte pour chaque champ.
| Attribut | Description | Par défaut |
|---|---|---|
| hintEnabled | Active ou désactive l'étiquette flottante | true |
| hintAnimationEnabled | Active l'animation de montée/descente de l'étiquette | true |
| expandedHintEnabled | Affiche l'étiquette même si le champ est vide et sans focus | false |
| hintTextAppearance | Style du texte de l'étiquette flottante | Thème de l'application |
TextInputLayout fournit un système d'affichage d'erreurs intégré visuellement intégré au champ de saisie. Lors de la définition d'une erreur via la méthode setError, le composant met en surbrillance le champ (la couleur de la ligne ou du contour passe au rouge) et affiche le texte d'erreur sous le champ. Cela élimine le besoin d'un TextView séparé pour les messages d'erreur.
La gestion de l'affichage des erreurs se fait via les méthodes setError(CharSequence) et setErrorEnabled(boolean). Lors de l'appel de setError avec du texte, l'erreur s'affiche immédiatement ; lors de l'appel de setError(null), elle est masquée. TextInputLayout prend également en charge une icône d'erreur personnalisée via l'attribut app:errorIconDrawable et la gestion de la couleur d'erreur via app:errorTextColor.
Selon les Material Design Guidelines (2025), les messages d'erreur doivent être spécifiques et utiles : au lieu de « Saisie invalide », écrivez « L'email doit contenir @ ». L'affichage de l'erreur doit se produire après la fin de la saisie (à la perte du focus ou après la soumission du formulaire), pas en temps réel — cela réduit le stress de l'utilisateur lors du remplissage des formulaires.
// Configuration programmatique des erreurs
textInputLayout.error = "Password min 8 chars"
// Masquage des erreurs
textInputLayout.error = null
// Vérification et définition des erreurs de validation
if (email.isNullOrBlank()) {
tilEmail.error = "Email is required"
} else {
tilEmail.error = null
}
TextInputLayout prend en charge l'affichage d'icônes à la fois au début du champ (icône de début) et à la fin (icône de fin). Les icônes peuvent remplir diverses fonctions : basculer la visibilité du mot de passe, effacer le champ, actions personnalisées. Chaque type d'icône est contrôlé par un attribut séparé et peut être remplacé par une icône personnalisée via l'attribut app:startIconDrawable ou app:endIconDrawable.
Le mode d'icône de fin est défini via l'attribut app:endIconMode, qui peut prendre les valeurs suivantes : password_toggle — basculement de la visibilité du mot de passe, clear_text — effacement du champ, dropdown_menu — flèche pour liste déroulante, custom — icône personnalisée. Pour password_toggle, TextInputLayout gère automatiquement le basculement de inputType entre textPassword et textVisiblePassword, et anime également l'icône de l'œil.
<!-- TextInputLayout with password toggle icon -->
@+id/tilPassword
android:layout_width="match_parent"
app:endIconMode="password_toggle"
app:passwordToggleTint="@color/primary">
@+id/etPassword
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
Material Components pour Android propose deux styles principaux pour TextInputLayout : FilledBox (rempli) et OutlinedBox (avec contour). Le style FilledBox a un fond rempli de couleur et une ligne sous le champ qui change de couleur au focus. Le style OutlinedBox a un fond transparent et un contour autour de tout le champ, créant des limites plus claires et convenant mieux aux formulaires comportant de nombreux champs.
Le choix du style dépend de la conception de l'application : FilledBox est recommandé pour les formulaires fréquemment utilisés car il attire moins l'attention sur les champs individuels. OutlinedBox est préférable pour les formulaires courts (connexion, inscription) où chaque champ doit être clairement identifié. Le style est défini via l'attribut style dans le XML ou via le thème de l'application.
| Caractéristique | FilledBox | OutlinedBox |
|---|---|---|
| Fond | Remplissage de couleur (généralement gris) | Transparent |
| Bordure | Ligne en bas | Contour autour du champ |
| Focus | La ligne s'épaissit et change de couleur | Le contour change de couleur et s'épaissit |
| Recommandation | Formulaires à saisie fréquente | Formulaires courts, accent sur les champs |
| Style | Widget.MaterialComponents.TextInputLayout.FilledBox | Widget.MaterialComponents.TextInputLayout.OutlinedBox |
Material Design 3 (M3) a introduit des styles mis à jour pour TextInputLayout avec une typographie améliorée, de nouveaux jetons de couleur et la prise en charge des couleurs dynamiques Material You. Dans M3, OutlinedBox est devenu le style recommandé par défaut, et FilledBox a adapté ses marges intérieures et son rayon de bordure pour correspondre à la nouvelle spécification.
Un exemple complet d'implémentation d'un formulaire d'inscription avec TextInputLayout, comprenant la validation de l'email et du mot de passe, l'affichage des erreurs et une icône d'affichage du mot de passe. Lorsque le bouton d'inscription est enfoncé, tous les champs sont vérifiés et les messages d'erreur correspondants sont affichés.
@+id/tilName
app:boxBackgroundMode="outlined">
@+id/etName
android:hint="Name" />
</...TextInputLayout>
@+id/tilRegEmail
app:boxBackgroundMode="outlined">
@+id/etRegEmail
android:hint="Email"
android:inputType="textEmailAddress" />
</...TextInputLayout>
@+id/tilRegPassword
app:boxBackgroundMode="outlined"
app:endIconMode="password_toggle">
@+id/etRegPassword
android:hint="Password"
android:inputType="textPassword" />
</...TextInputLayout>
private fun validateForm(): Boolean {
var isValid = true
if (etName.text.isNullOrBlank()) {
tilName.error = "Enter your name"
isValid = false
} else {
tilName.error = null
}
val email = etRegEmail.text.toString()
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
tilRegEmail.error = "Invalid email format"
isValid = false
} else {
tilRegEmail.error = null
}
val password = etRegPassword.text.toString()
if (password.length < 8) {
tilRegPassword.error = "Password min 8 chars"
isValid = false
} else {
tilRegPassword.error = null
}
return isValid
}
Questions fréquemment posées
TextInputLayout est disponible à partir de la version 1.0.0 de la bibliothèque com.google.android.material. Pour les fonctionnalités de Material Design 3, utilisez la version 1.6.0 et supérieure. Incluez : implementation « com.google.android.material:material:1.12.0 » dans le build.gradle du module.
La couleur de l'étiquette flottante en état de focus est contrôlée par l'attribut app:hintTextColor ou via le thème avec colorPrimary. Pour différents états (focus, erreur, désactivé), utilisez un sélecteur dans res/color/ ou les attributs boxStrokeColor, errorTextColor de la bibliothèque Material Components.
Définissez l'attribut app:counterEnabled=« true » et spécifiez le nombre maximum de caractères avec app:counterMaxLength=« 100 ». TextInputLayout affichera automatiquement le compteur en bas du champ (par exemple, « 25/100 »). La couleur du compteur peut être configurée via app:counterTextColor et app:counterOverflowTextColor pour le dépassement de la limite.
FilledBox — fond rempli de couleur, accent sur la ligne inférieure. Prend moins d'espace visuel. OutlinedBox — fond transparent avec contour autour du champ, bordures plus visibles. FilledBox est recommandé pour les champs à saisie fréquente, OutlinedBox pour les formulaires courts où la clarté de chaque champ est importante.
Oui, définissez l'attribut app:hintEnabled=« false » pour désactiver l'étiquette flottante. Dans ce cas, TextInputLayout fonctionnera comme un wrapper normal pour EditText, conservant les fonctionnalités d'erreur, d'icônes et de compteur de caractères, mais sans l'animation de l'étiquette. Utile pour les champs où une indication n'est pas nécessaire ou une étiquette personnalisée est utilisée.
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