web-dev-qa-db-fra.com

Définir par programme TextInputLayout Hint Couleur du texte et Couleur de l'étiquette flottante

J'utilise un TextInputLayout, je voudrais définir par programme la couleur du texte de conseil et la couleur de l'étiquette flottante si le champ de saisie est obligatoire. Avant de passer à TextInputLayout, j’utilisais par programme la couleur du texte d’aide à l’aide des éléments suivants

textField.setHintTextColor(Color.RED);

Quelqu'un peut-il me guider sur la façon de définir la couleur du texte de conseil et la couleur de l'étiquette flottante par programmation pour un TextInputLayout.

Dans la capture d'écran ci-jointe, je voudrais que le texte Adresse 1 soit en rouge lorsqu'il n'est pas mis au point et que l'étiquette active Adresse 1 doit être en rouge.

 enter image description here

14
S.A.Norton Stanley

J'ai changé de couleur focalisée avec réflexion. Voici l'extrait qui peut aider quelqu'un.

private void setUpperHintColor(int color) {
    try {
        Field field = textInputLayout.getClass().getDeclaredField("mFocusedTextColor");
        field.setAccessible(true);
        int[][] states = new int[][]{
                new int[]{}
        };
        int[] colors = new int[]{
                color
        };
        ColorStateList myList = new ColorStateList(states, colors);
        field.set(textInputLayout, myList);

        Method method = textInputLayout.getClass().getDeclaredMethod("updateLabelState", boolean.class);
        method.setAccessible(true);
        method.invoke(textInputLayout, true);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

EDIT 2018-08-01:

Si vous utilisez la bibliothèque de conception v28.0.0 et ultérieure, les champs sont passés de mDefaultTextColor à defaultHintTextColor et de mFocusedTextColor à focusedTextColor.

Vérifiez la classe décompilée pour d'autres champs.

14
alexandrius

Veuillez consulter la documentation ici: Méthodes TextInputLayout

Il y a une méthode:

setHintTextAppearance(int resId)

Ce qui prend un identifiant de ressource qui pourrait être une ressource de couleur! 

Je voudrais essayer cela et voir comment ça se passe!

J'espère que ça t'aide!

4
Eenvincible

Pour changer à la fois Focused Color et Default Text Color pour TextInput Layout

private void setInputTextLayoutColor(int color, TextInputLayout textInputLayout) {
    try {
        Field field = textInputLayout.getClass().getDeclaredField("mFocusedTextColor");
        field.setAccessible(true);
        int[][] states = new int[][]{
                new int[]{}
        };
        int[] colors = new int[]{
                color
        };
        ColorStateList myList = new ColorStateList(states, colors);
        field.set(textInputLayout, myList);

        Field fDefaultTextColor = TextInputLayout.class.getDeclaredField("mDefaultTextColor");
        fDefaultTextColor.setAccessible(true);
        fDefaultTextColor.set(textInputLayout, myList);

        Method method = textInputLayout.getClass().getDeclaredMethod("updateLabelState", boolean.class);
        method.setAccessible(true);
        method.invoke(textInputLayout, true);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

EDIT: Pour changer la couleur de la ligne AppCompactEditText

Vous devez définir backgroundTintList (ou supportBackgroundTintList) sur EditText sur une instance de ColorStateList contenant uniquement la couleur que vous souhaitez modifier. Voici un moyen simple de faire ceci de manière compatible avec les versions antérieures:

ColorStateList colorStateList = ColorStateList.valueOf(color)
editText.setSupportBackgroundTintList(colorStateList)

Cela donnera à la EditText la couleur de soulignement souhaitée.

3
Naveen Kumar M

Normalement, la couleur du texte d'indication de TextInputLayout provient de colorAccent de l'application.

Mais si vous voulez changer, vous pouvez utiliser le style pour cela.

<Android.support.design.widget.TextInputLayout
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:theme="@style/TextLabel">
 </Android.support.design.widget.TextInputLayout>

@style 

<style name="TextLabel" parent="TextAppearance.AppCompat">
    <!-- Hint color and label color in FALSE state -->
    <item name="Android:textColorHint">@color/Color Name</item> 
    <item name="Android:textSize">20sp</item>
    <!-- Label color in TRUE state and bar color FALSE and TRUE State -->
    <item name="colorAccent">@color/Color Name</item>
    <item name="colorControlNormal">@color/Color Name</item>
    <item name="colorControlActivated">@color/Color Name</item>
 </style>

Mais si vous souhaitez ajouter une couleur rouge, comment la différencier avec une couleur d'erreur signifie que l'erreur standard de base est de couleur rouge.

textField.setHintTextColor (Color.RED); Quelqu'un peut-il me guider sur la façon de définir la couleur du texte de conseil et la couleur de l'étiquette flottante par programmation pour un TextInputLayout.

setHintTextColor fonctionne pour l'API 23+

3
ViramP

Permettez-moi de partager mon expérience à ce sujet. J'ai également essayé toutes les solutions données dans chaque question liée à celle-ci. i.e. Changez la couleur de repère du widget enfant en TextInputLayout

Je suis heureux de partager la réponse à cette question avec un peu de détail.

Tout ce que nous devons savoir, c'est: -

  1. Ajouter une ligne au style de TextInputLayout ou de son widget enfant n’est pas une aide précieuse.

    <item name = "Android: textColorHint"> @ color/white </ item>

    car il utilisera colorAccent chaque fois que le focus est reçu/accordé au widget éditable.

  2. La réponse réelle à ce problème consiste à ajouter cette ligne de style dans la balise de style de l'application, grâce à laquelle elle définira la couleur de conseil lorsque cette zone modifiable ou toute autre zone modifiable n'est pas active. (C'est le point qui nous manque à chaque fois).

S'il vous plaît laissez-moi savoir si nous avons d'autres informations à ce sujet.

Merci!

0
Harpreet