Exemple de Android TextInputLayout

Dans ce tutoriel, nous examinerons en détail les fonctionnalités qu’Android TextInputLayout nous offre. Android TextInputLayout est un composant de conception fourni avec la bibliothèque de support Material Design.

Android TextInputLayout

Android TextInputLayout étend LinearLayout. L’utilisation principale d’un TextInputLayout est de servir d’enveloppe pour EditText (ou ses descendants) et de permettre des animations d’indications flottantes. Règle générale : TextInputLayout doit envelopper TextInputEditText au lieu de l’EditText normal. Raison? TextInputEditText est une sous-classe d’EditText conçue pour être utilisée comme enfant de TextInputLayout. De plus, utiliser un EditText générerait un avertissement : L'EditText ajouté n'est pas un TextInputEditText. Veuillez utiliser cette classe à la place. TextInputLayout offre bien plus que la simple affichage des étiquettes d’indication flottantes.

Fonctionnalités d’Android TextInputLayout

Certaines des fonctionnalités que nous aborderons dans ce tutoriel sont :

  1. Activation/Désactivation des indications flottantes
  2. Activation/Désactivation de l’animation des indications flottantes
  3. Affichage des messages d’erreur
  4. Affichage du compteur de caractères
  5. Alarmer l’utilisateur lorsque le nombre de caractères dépasse sa limite
  6. Personnalisation de l’apparence du texte pour l’indicateur flottant, l’étiquette d’erreur, le compteur de caractères
  7. Toggle de visibilité du mot de passe

Nous examinerons chacune de ces fonctionnalités et les mettrons en œuvre dans un projet Android Studio.

Structure du projet exemple Android TextInputLayout

Il s’agit d’une application à activité unique. Nous effectuerons toutes les tâches à l’intérieur des fichiers de mise en page, d’activité et de styles.xml et colors.xml. Tout d’abord, ajoutez la dépendance pour la bibliothèque de support de conception à l’intérieur du fichier build.gradle comme indiqué ci-dessous.

compile 'com.android.support:design:25.3.1'

Activation/Désactivation des indicateurs flottants

Les indicateurs flottants sont activés par défaut dans un TextInputLayout. Pour les désactiver, nous devons ajouter l’attribut suivant à l’intérieur de la balise : app:hintEnabled="false". Le code XML ci-dessous provient de la mise en page activity_main.xml et contient trois champs EditText.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.journaldev.featuresoftextinputlayout.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">


        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            android:hint="TextInputEditText" />


        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="@dimen/activity_horizontal_margin">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Floating Hint Enabled Default" />

        </android.support.design.widget.TextInputLayout>


        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:hintEnabled="false">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Floating Hint Disabled" />

        </android.support.design.widget.TextInputLayout>

</LinearLayout>
</ScrollView>

Le troisième champ EditText a l’astuce flottante désactivée. Voyons le résultat que le code ci-dessus nous donne :

Activation/Désactivation de l’animation de l’astuce flottante

Tout comme la fonctionnalité précédente, l’animation de l’astuce flottante est activée par défaut. Pour la désactiver, nous devons ajouter l’attribut suivant à l’intérieur de la balise TextInputLayout. app:hintAnimationEnabled="false" Le code XML ci-dessous provient de la mise en page activity_main.xml et contient des champs EditText pour l’un ou l’autre des cas.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.journaldev.featuresoftextinputlayout.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="@dimen/activity_horizontal_margin">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Floating Hint Enabled Default" />

        </android.support.design.widget.TextInputLayout>


        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:hintAnimationEnabled="false">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Hint Animation Disabled" />

        </android.support.design.widget.TextInputLayout>

</LinearLayout>
</ScrollView>

Le résultat du code ci-dessus est affiché ci-dessous. Il est à noter que le deuxième champ EditText n’anime pas l’astuce flottante lorsqu’il est en focus.

Personnalisation de l’apparence du texte de l’astuce

Pour utiliser une couleur de texte personnalisée textColor et une taille de texte textSize pour les indications, l’attribut suivant est utilisé : app:hintTextAppearance="@style/HintText" Le style HintText est écrit à l’intérieur du fichier styles.xml comme indiqué ci-dessous

<style name="HintText" parent="TextAppearance.Design.Hint">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">@color/colorPrimary</item>
    </style>

Le code XML ci-dessous provient de la mise en page activity_main.xml et contient des champs EditText pour l’un ou l’autre des cas (avec/sans hintTextAppearance).

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.journaldev.featuresoftextinputlayout.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="@dimen/activity_horizontal_margin">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Floating Hint Enabled" />

        </android.support.design.widget.TextInputLayout>


        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:hintTextAppearance="@style/HintText">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Custom Hint TextAppearance" />

        </android.support.design.widget.TextInputLayout>

</LinearLayout>
</ScrollView>

La sortie du code ci-dessus est affichée ci-dessous.

Compteur de caractères

Le compteur de caractères est une fonctionnalité utilisée par plusieurs applications. (Rappelez-vous la limite de caractères sur Twitter?). Définissez app:counterEnabled sur true et app:counterMaxLength avec le nombre maximal de caractères que vous souhaitez dans le TextInputLayout. Le compteur de caractères est affiché par défaut en dessous de l’EditText (en bas à droite) et, lors de la rédaction de ce tutoriel, il n’y a aucun moyen de changer la position pour le moment. La mise en forme du compteur est similaire à celle du texte d’indication. app:counterTextAppearance est l’attribut utilisé cette fois-ci. Nous avons ajouté le style suivant dans le fichier styles.xml de notre projet.

<style name="CounterText" parent="TextAppearance.Design.Counter">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">@color/my_pink</item>
    </style>

Le code XML ci-dessous provient de la mise en page activity_main.xml et contient des champs EditText avec un compteur de caractères par défaut et un compteur personnalisé.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.journaldev.featuresoftextinputlayout.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:counterEnabled="true"
            app:counterMaxLength="5"
            app:hintTextAppearance="@style/HintText">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Character Counter Limit 10" />

        </android.support.design.widget.TextInputLayout>


        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:counterEnabled="true"
            app:counterMaxLength="5"
            app:counterTextAppearance="@style/CounterText"
            app:hintTextAppearance="@style/HintText">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Character Counter Custom TextAppearance" />

        </android.support.design.widget.TextInputLayout>

</LinearLayout>
</ScrollView>

Le résultat du code ci-dessus est donné ci-dessous. Observons de près la sortie ci-dessus.

  • Le premier champ EditText modifie sa couleur de texte du compteur , la couleur de texte d’indice et la couleur de l’indicateur lorsque le nombre de caractères est dépassé.
  • Le deuxième champ EditText fait la même chose mais il modifie également la couleur de texte du compteur personnalisée et la taille de texte personnalisée lorsque la limite est dépassée.

Pour spécifier le style dont nous avons besoin lorsque le compteur de caractères dépasse sa limite, nous devons utiliser l’attribut counterFlow que nous verrons ensuite.

Débordement du compteur de caractères

Comme nous l’avons vu ci-dessus, lorsque le nombre de caractères dépasse la limite définie, le texte du compteur utilise les attributs définis dans counterFlow . Si les attributs n’étaient pas présents, il resterait aux valeurs par défaut que nous avons vues dans la sortie ci-dessus. Nous devons utiliser le paramètre suivant app: counterOverflowTextAppearance Le style pour CounterOverflow est présent dans styles.xml:

 <style name="CounterOverFlow" parent="TextAppearance.Design.Counter.Overflow">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">@color/my_orange</item>
    </style>

Ajouter le code ci-dessous à la mise en page précédente activity_main.xml :

<android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:counterEnabled="true"
            app:counterMaxLength="5"
            app:counterOverflowTextAppearance="@style/CounterOverFlow"
            app:counterTextAppearance="@style/CounterText"
            app:hintTextAppearance="@style/HintText">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="CounterOverflow CustomTextAppearance" />

        </android.support.design.widget.TextInputLayout>

Exécutons à nouveau l’application.

Étiquette d’erreur

Le paramètre app:errorEnabled à true nous permet d’afficher un texte d’erreur sous notre champ EditText lorsque certaines conditions sont remplies. Pour styliser le texte d’erreur, nous utilisons l’attribut app:errorTextAppearance et ajoutons le code suivant à l’intérieur de notre fichier styles.xml.

<style name="ErrorText" parent="TextAppearance.Design.Error">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">@color/my_black</item>
    </style>

Le code XML ci-dessous provient de la mise en page activity_main.xml et contient des champs EditText pour une étiquette d’erreur par défaut et une personnalisée.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.journaldev.featuresoftextinputlayout.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.design.widget.TextInputLayout
            android:id="@+id/errorInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:counterEnabled="true"
            app:counterMaxLength="5"
            app:counterOverflowTextAppearance="@style/CounterOverFlow"
            app:counterTextAppearance="@style/CounterText"
            app:errorEnabled="true"
            app:hintTextAppearance="@style/HintText">

            <android.support.design.widget.TextInputEditText
                android:id="@+id/errorEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Default Error Label" />

        </android.support.design.widget.TextInputLayout>


        <android.support.design.widget.TextInputLayout
            android:id="@+id/customErrorInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:counterEnabled="true"
            app:counterMaxLength="5"
            app:counterOverflowTextAppearance="@style/CounterOverFlow"
            app:counterTextAppearance="@style/CounterText"
            app:errorEnabled="true"
            app:errorTextAppearance="@style/ErrorText"
            app:hintTextAppearance="@style/HintText">

            <android.support.design.widget.TextInputEditText
                android:id="@+id/customErrorEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Custom Error Label" />

        </android.support.design.widget.TextInputLayout>

</LinearLayout>
</ScrollView>

Pour afficher le texte d’erreur, nous devons appeler la méthode setError(String) sur une instance de TextInputLayout dans notre classe MainActivity.java, comme indiqué ci-dessous.

package com.journaldev.featuresoftextinputlayout;

import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;

public class MainActivity extends AppCompatActivity {


    TextInputLayout errorInputLayout, customErrorInputLayout;
    TextInputEditText errorEditText, customErrorEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        errorEditText = (TextInputEditText) findViewById(R.id.errorEditText);
        errorInputLayout = (TextInputLayout) findViewById(R.id.errorInputLayout);

        customErrorEditText = (TextInputEditText) findViewById(R.id.customErrorEditText);
        customErrorInputLayout = (TextInputLayout) findViewById(R.id.customErrorInputLayout);

        errorEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

                if (s.length() > errorInputLayout.getCounterMaxLength())
                    errorInputLayout.setError("Max character length is " + errorInputLayout.getCounterMaxLength());
                else
                    errorInputLayout.setError(null);

            }
        });

        customErrorEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

                if (s.length() > customErrorInputLayout.getCounterMaxLength())
                    customErrorInputLayout.setError("Max character length is " + customErrorInputLayout.getCounterMaxLength());
                else
                    customErrorInputLayout.setError(null);

            }
        });


    }
}

Dans le code ci-dessus, nous ajoutons un TextChangedListener (qui implémente TextWatcher) sur chaque instance de TextInputEditText. Nous affichons l’étiquette d’erreur lorsque le nombre actuel de caractères dépasse la limite maximale du compteur. Pour effacer l’étiquette d’erreur, nous définissons la valeur à l’intérieur de setError() comme null. La sortie que le code ci-dessus nous donne est : Note: L’indicateur du champ de texte utilise la même couleur que l’étiquette d’erreur. Il remplace la couleur définie par counterOverflow et a donc la priorité la plus élevée.

Basculer la visibilité du mot de passe

En définissant app:passwordToggleEnabled sur true, vous pouvez afficher/masquer le mot de passe. Pour changer la couleur de l’icône, utilisez app:passwordToggleTint. Le code XML ci-dessous provient de la mise en page activity_main.xml et contient des champs EditText pour une bascule de visibilité du mot de passe (icône par défaut et avec une teinte).

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.journaldev.featuresoftextinputlayout.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:counterEnabled="true"
            app:counterMaxLength="5"
            app:counterOverflowTextAppearance="@style/CounterOverFlow"
            app:counterTextAppearance="@style/CounterText"
            app:hintTextAppearance="@style/HintText"
            app:passwordToggleEnabled="true">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Password Visibility Toggle"
                android:inputType="textPassword" />

        </android.support.design.widget.TextInputLayout>


        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            app:counterEnabled="true"
            app:counterMaxLength="5"
            app:counterOverflowTextAppearance="@style/CounterOverFlow"
            app:counterTextAppearance="@style/CounterText"
            app:hintTextAppearance="@style/HintText"
            app:passwordToggleEnabled="true"
            app:passwordToggleTint="@color/my_orange">

            <android.support.design.widget.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Password Visibility Toggle Tint"
                android:inputType="textPassword" />

        </android.support.design.widget.TextInputLayout>
</LinearLayout>
</ScrollView>

La sortie affichée par le code ci-dessus est: Note: Nous pouvons utiliser nos propres icônes personnalisées à partir de la bascule de visibilité du mot de passe en utilisant app:passwordToggleDrawable. Cela met fin à ce tutoriel. Nous avons couvert toutes les principales fonctionnalités présentes dans TextInputLayout. Vous pouvez télécharger le Projet d’exemple Android TextInputLayout à partir du lien ci-dessous. Il inclut chacun des extraits de code ci-dessus.

Télécharger le projet Android TextInputLayout

Référence: Documentation officielle d’Android

Source:
https://www.digitalocean.com/community/tutorials/android-textinputlayout-example