Проблема пользовательского стиля TextInputEditText (когда содержит текст)

Мне нужен цвет нижней строки TextInputEditText, как показано ниже.

  • Цвет по умолчанию => Серый

  • Если пользователь вводит текст, цвет линии должен оставаться синим. В настоящее время, если я ввожу ввод в первый текст редактирования и перехожу к другому тексту редактирования, первый снова становится серым.

  • Edittext пуст => Серый

    Мне также требуется анимация подсказок по умолчанию для TextInputLayout, поэтому я не могу использовать EditText. Я реализовал это, используя TextWatcher, как здесь, но не работает.

Вот мой код

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/EditScreenTextInputLayoutStyle"
        app:hintTextAppearance="@style/etHintText">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/etAddress"
            style="@style/et_14_blk_sngl"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:inputType="text"
            android:singleLine="true" />
    </android.support.design.widget.TextInputLayout>

Стиль :

<style name="EditScreenTextInputLayoutStyle">
<item name="colorControlNormal">@color/gray</item>
<item name="colorControlActivated">@color/blue</item>
<item name="colorControlHighlight">@color/blue</item></style>

А также,

private void UpdateLineColor()
    {
        if (!TextUtils.IsEmpty(this.Text))
        {
            DrawableCompat.SetTint(this.Background, ContextCompat.GetColor(this.Context, Resource.Color.blue));

            if (Build.VERSION.SdkInt >= Build.VERSION_CODES.Lollipop)
            {
                ColorStateList colorStateList = ColorStateList.ValueOf(Resources.GetColor(Resource.Color.blue));
                this.BackgroundTintList = colorStateList;
                ViewCompat.SetBackgroundTintList(this, colorStateList);
            }

            this.Background.SetColorFilter(Resources.GetColor(Resource.Color.blue), PorterDuff.Mode.SrcAtop);
        }
        else
        {
            DrawableCompat.SetTint(this.Background, ContextCompat.GetColor(this.Context, Resource.Color.gray));

            if (Build.VERSION.SdkInt >= Build.VERSION_CODES.Lollipop)
            {
                ColorStateList colorStateList = ColorStateList.ValueOf(Resources.GetColor(Resource.Color.gray));
                this.BackgroundTintList = colorStateList;
                ViewCompat.SetBackgroundTintList(this, colorStateList);
            }

            this.Background.SetColorFilter(Resources.GetColor(Resource.Color.gray), PorterDuff.Mode.SrcAtop);
        }
    }

person Srikanth    schedule 09.05.2019    source источник
comment
какая у вас версия устройства? у меня работает сет android:theme   -  person Leo Zhu - MSFT    schedule 10.05.2019
comment
@LeoZhu-MSFT Не работает ни на одном устройстве. при наведении цвет линии становится синим. но если я ввожу в него текст и перехожу к другому тексту редактирования, первый снова становится серым. Он должен оставаться синим, так как содержит текст.   -  person Srikanth    schedule 10.05.2019
comment
хорошо, я знаю, вы хотите, чтобы он оставался синим, если у него есть контент   -  person Leo Zhu - MSFT    schedule 10.05.2019


Ответы (2)


вы можете настроить фон TextInputEditText, например:

пользовательский et_underline_selected.axml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
  android:bottom="0dp"
  android:left="-2dp"
  android:right="-2dp"
  android:top="-2dp">
  <shape>
    <solid android:color="@android:color/transparent" />
    <stroke
      android:width="1dp"
      android:color="#00f" />  // color blue
      <padding android:bottom="4dp" />
   </shape>
 </item>
</layer-list>   

et_underline_unselected.axml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:bottom="0dp"
    android:left="-2dp"
    android:right="-2dp"
    android:top="-2dp">
     <shape>
     <solid android:color="@android:color/transparent" />
     <stroke
       android:color="#0f0"
       android:width="1dp" />
      <padding android:bottom="4dp" />
    </shape>
  </item>
</layer-list>

edittext_bg_selector.axml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true" 
    android:drawable="@drawable/et_underline_unselected"/>
  <item android:state_focused="false" 
    android:drawable="@drawable/et_underline_selected"/>
</selector>

эти три файла помещаются в Resources/drawable

затем в вашем layout.axml:

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:hintTextAppearance="@style/etHintText">
    <android.support.design.widget.TextInputEditText
        android:id="@+id/etAddress"
        style="@style/et_14_blk_sngl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:inputType="text"
        android:background="@drawable/edittext_bg_selector"
        android:singleLine="true" />
</android.support.design.widget.TextInputLayout>

наконец, в вашем activity.cs:

TextInputEditText etAddress = FindViewById<TextInputEditText>(Resource.Id.etAddress);

etAddress.FocusChange += (s, e) =>
        {
            if (e.HasFocus)
            {
                etAddress.SetBackgroundResource(Resource.Drawable.et_underline_selected);
            }
            else
            {
                if (etAddress.Text.Length > 0)
                {
                    etAddress.SetBackgroundResource(Resource.Drawable.et_underline_selected);
                }
                else
                {
                    etAddress.SetBackgroundResource(Resource.Drawable.et_underline_unselected);
                }
            }
        };

Вам нужен этот эффект?

person Leo Zhu - MSFT    schedule 10.05.2019

Замените style на:

<style name="EditScreenTextInputLayoutStyle" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">@color/gray</item>
    <item name="colorControlActivated">@color/blue</item>
    <item name="colorControlHighlight">@color/blue</item>
</style>
person Dinesh Shingadiya    schedule 09.05.2019