программно изменить цвет TextInputLayout textColorHint, чтобы указать/показать отключенный editText внутри

У меня есть EditText внутри TextInputLayout. Я хотел бы программно изменить цвет textColorHint TextInputLayout. Поскольку мне нужно было бы включать и отключать editTexts, пока пользователь заполняет формы. Например, форма для забвения пароля с 5 editText и 3 кнопками. Пользователь должен отправить свой адрес электронной почты, проверочный код, новый и подтвердить пароль. Только когда их электронная почта отправлена, код подтверждения EditText, кнопка отправки подтверждения включена. и так далее.

Следовательно, чтобы показать отключенный, я хотел бы, чтобы текст EditText (заполнитель), также известный как android:hint в EditText xml, подчеркивал, чтобы он был немного серым/более прозрачным. Это можно решить с помощью setAlpha(.5f); но я хотел бы изменить цвет. Измените мой textPlaceholderColor (серый) на более светлый серый цвет.

Я пробовал метод app:hintTextApperance=@style/TextInputLayoutHintText, но android:TextColorHint, похоже, не работает внутри. Я даже пытался изменить стиль, используя codeLayout.setHintTextAppearance(R.style.TextInputLayoutHintTextDisabled); Я также пробовал метод селектора в EditText. Но кажется, что android:TextColorHint не работает в EditText; установка цвета для него не работает. Это должно быть изменено внутри TextInputLayout.

в моем файле стиля

    <!-- Legacy TextField Theme-->
    <style name="TextInputLayoutAppearance" parent="Widget.Design.TextInputLayout">
        <item name="colorControlNormal">@color/textPlaceholderColor </item>
        <item name="colorControlActivated">@color/textFieldColor</item>
        <item name="colorControlHighlight">@color/textFieldColor</item>
    </style>


    <!-- TextField Hint Theme-->
    <style name="TextInputLayoutHintText">
        <item name="android:textColor">@color/textPlaceholderColor</item>
        <item name="android:textSize">16sp</item>
        <item name="android:textColorHint">@color/disableTextColor </item>
    </style>

    <!-- TextField Text Color Hint Theme Disabled-->
    <style name="TextInputLayoutHintTextDisabled">
        <item name="android:textColor">@color/disableTextColor </item>
        <item name="android:textSize">16sp</item>
        <item name="android:textColorHint">@color/disableTextColor </item>
        <item name="hintTextColor">@color/disableTextColor </item>
    </style>

в моем XML-файле активности

<com.google.android.material.textfield.TextInputLayout
            android:id="@+id/forgetTextInputLayout2"
            style="@style/TextInputLayoutAppearance"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="20dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="20dp"
            android:elevation="12dp"
            app:endIconMode="clear_text"
            android:textColorHint="@color/textPlaceholderColor"
            app:hintTextAppearance="@style/TextInputLayoutHintText"
            app:layout_constraintEnd_toEndOf="@+id/forgetForm"
            app:layout_constraintStart_toStartOf="@+id/forgetForm"
            app:layout_constraintTop_toBottomOf="@+id/forget_submit_email">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/forgetVerification"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:fontFamily="@font/open_sans"
                android:hint="@string/ForgetForm3"
                android:inputType="textPersonName"
                android:singleLine="true"
                android:textColor="@drawable/edit_text_selector"
                android:textCursorDrawable="@drawable/cursor_color"
                android:textSize="18sp" />
        </com.google.android.material.textfield.TextInputLayout>

цветной файл

  <color name="colorPrimary">#00BEBA</color>
    <color name="colorPrimaryDark">#00BEBA</color>
    <color name="colorAccent">#F60606</color>
    <color name="white">#FFFFFF</color>
    <color name="green">#17B3AB</color>
    <color name="version">#0B0008</color>
    <color name="appBackgroundColor">#00BEBA</color>
    <color name="textPlaceholderColor">#807E7E</color>
    <color name="textFieldColor">#000000</color>
    <color name="textFieldCursorColor">#FB0000</color>
    <color name="textFieldHightLightColor">#2196F3</color>
    <color name="customGreen">#92CFCD</color>
    <color name="defaultLinkBlue">#007aff</color>
    <color name="facebookBlue">#3B5998</color>
    <color name="disableTextColor">#3C95A1A0</color>



Ответы (3)


Вы можете сделать это с помощью пользовательского стиля:

    <com.google.android.material.textfield.TextInputLayout
        style="@style/MyTextInputLayout"

определение селектора:

  <style name="MyTextInputLayout " parent="Widget.MaterialComponents.TextInputLayout.FilledBox" >    
   <item name="android:textColorHint">@color/my_selector</item>.  
  </style>

с:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:alpha="0.38" android:color="@color/colorSecondaryLight" android:state_enabled="false"/>
    <item android:alpha="0.6" android:color="@color/colorPrimary"/>
</selector>

Таким образом, включение/выключение TextInputLayout изменения цвета.

введите здесь описание изображения

введите здесь описание изображения

Программно вы можете использовать метод setDefaultHintTextColor:

    TextInputLayout textInputLayout = findViewById(R.id.til);                   
    textInputLayout.setDefaultHintTextColor
      (ContextCompat.getColorStateList(this,R.color.selector));
person Gabriele Mariotti    schedule 25.06.2020

Используйте этот стиль в файле стиля:

 <style name="EditTextWrapper">
        <item name="android:layout_width">match_parent</item>
        <item name="android:textAppearance">@style/TextAppearance_open_sans_semibold</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColorHint">@color/brown</item>
        <item name="counterOverflowTextAppearance">@style/CounterOverFlow</item>
        <item name="counterTextAppearance">@style/CounterText</item>
        <item name="errorTextAppearance">@style/ErrorText</item>
        <item name="hintTextAppearance">@style/CustomHint</item>
    </style>

    <style name="CounterOverFlow" parent="TextAppearance.Design.Counter.Overflow">
        <item name="android:textSize">1sp</item>
        <item name="android:textAppearance">@style/TextAppearance_open_sans_semibold</item>
        <item name="android:textColor">@color/green</item>
    </style>

    <style name="CustomHint" parent="TextAppearance.Design.Hint">
        <item name="android:textSize">@dimen/sp11</item>
        <item name="android:textColor">@color/green</item>
        <item name="colorAccent">@color/green</item>
        <item name="colorControlNormal">@color/green</item>
        <item name="android:textAppearance">@style/TextAppearance_open_sans_semibold</item>
        <item name="colorControlActivated">@color/green</item>
        <item name="android:textColorHint">@color/green</item>
        <!--<item name="android:textAppearance">@style/TextAppearance.angelina_script</item>-->
    </style>

    <style name="CounterText" parent="TextAppearance.Design.Counter">
        <item name="android:textSize">1sp</item>
        <item name="android:textAppearance">@style/TextAppearance_open_sans_semibold</item>

        <item name="android:textColor">@color/green</item>
    </style>

    <style name="ErrorText" parent="TextAppearance.Design.Error">
        <item name="android:textSize">@dimen/sp12</item>
        <item name="android:textColor">@color/red</item>
        <item name="android:textAppearance">@style/TextAppearance_open_sans_semibold</item>

        <item name="android:textColorHint">@color/red</item>
    </style>

способ использования в макете:

  <com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/wrapper_password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColorHint="@color/white"
                    android:theme="@style/EditTextWrapper">

                <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/edt_password"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:drawableRight="@drawable/ic_lock"
                        android:drawablePadding="@dimen/dp16"
                        android:hint="@string/password"
                        android:textAppearance="@style/TextView_Regular"
                        android:inputType="textPassword"
                        android:maxLines="1"
                        android:textColor="@android:color/white"
                        android:textSize="16sp" />
            </com.google.android.material.textfield.TextInputLayout>
person webaddicted    schedule 25.06.2020
comment
Привет, Webaddicted, я попытался создать новый проект с предоставленными вами кодами, как только отключил ваш wrapper_password с помощью TextInputLayout sampleLayout = findViewById(R.id.wrapper_password); sampleLayout.setEnabled(false); Когда параметр @string/password отключен, он становится серым, но я не могу настроить цвет в соответствии с вашим стилем. Вроде по умолчанию. - person 4nn4bel; 25.06.2020

Насколько я понял ваш вопрос, вы хотите убедиться, что все текстовые поля редактирования заполнены правильно. Для этого вы можете использовать textwatcher. Добавьте textwatcher в свои поля edittext и проверьте условие и включите или отключите кнопку, когда условие становится истинным или ложным.

Это пример кода для него

    //Say you have three edit fields and a button

EditText name = findviewbyId(R.id.name);
EditText email = findviewbyId(R.id.email);
EditText mobile = findviewbyId(R.id.mobile);

name.addTextWatcherListener(checkEmpty);
email.addTextWatcherListener(checkEmpty);
mobile.addTextWatcherListener(checkEmpty);


//Now add the method 

public TextWatcher checkEmpty = new TextWatcher(){

/* Here you'll get three method use the onTextChanged method and get the strings from edit text fields and check if they're empty or not if empty disable button else enable */ 
}
person CodeRED Innovations    schedule 25.06.2020
comment
спасибо за предложение, но у меня уже есть метод проверки ввода с помощью моих кнопок при нажатии для каждого раздела (1-й раздел: текст электронной почты, электронная почта, 2-й раздел: текст verify_code, 3-й раздел, текст newPass, confirmText, submitPassButton. Каждый раздел будет либо включен или отключено. Например: если пользователь находится в разделе электронной почты, текст электронной почты и кнопка электронной почты включены, остальные отключены. - person 4nn4bel; 25.06.2020
comment
Проблема, с которой я сталкиваюсь сейчас, заключается в изменении цвета TextInputLayout (который содержит EditText) textColorHint, чтобы показать, что он отключен. - person 4nn4bel; 25.06.2020