【问题标题】:TextInputLayout hint color in error state错误状态下的 TextInputLayout 提示颜色
【发布时间】:2018-03-21 22:56:12
【问题描述】:

根据 Google 的材料指南:

https://material.io/guidelines/components/text-fields.html#text-fields-layout

TextInputLayout 提示的颜色应与错误消息相同:

但事实并非如此,当我调用setError("My error") 时,只有下划线和错误消息显示为红色。

如何更改此行为以符合 Google 自己的准则?

【问题讨论】:

标签: android android-design-library


【解决方案1】:

你可以这样做:

 <android.support.design.widget.TextInputLayout
        android:padding="8dp"
        android:id="@+id/tilSample"
        app:errorTextAppearance="@style/error_appearance"
        app:hintTextAppearance="@style/error_appearance"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/etSample"
            android:layout_margin="8dp"
            android:padding="8dp"
            android:hint="android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

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

style.xml

<style name="error_appearance" parent="@android:style/TextAppearance">
        <item name="android:textColor">@color/colorRed</item>
        <item name="android:textSize">12sp</item>
    </style>

colors.xml

   <?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="colorRed">#f44336</color>
</resources>

编辑

我们也可以使用以下方法来处理代码中的错误和提示颜色:

tilSample.setErrorTextAppearance(R.style.error_appearance);  
tilSample.setHintTextAppearance(R.style.error_appearance);

【讨论】:

  • 为此,您可以使用 java 代码并在验证时相应地更改错误和提示。我也添加了 java 部分,未经测试,但它应该按照文档中的说明工作。
【解决方案2】:

这是一个例子:

    <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/email_layout"
                android:textColorHint="@color/gray"
                app:errorTextAppearance="@style/TextAppearence.App.TextInputLayout"
                app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout">

    <android.support.design.widget.TextInputEditText
                    android:id="@+id/et_email"
                    style="@style/TextStyle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:layout_marginRight="20dp"
                    android:cursorVisible="true"
                    android:gravity="center|left|bottom"
                    android:hint="@string/email"
                    android:inputType="textEmailAddress"
                    android:maxLength="50"
                    android:paddingBottom="10dp"
                    android:textColor="@color/black_effective"
                    android:textSize="18sp" />

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

样式文件:

   <style name="TextAppearence.App.TextInputLayout" parent="@android:style/TextAppearance">
        <item name="android:textColor">@color/gray</item>
    </style>

快照:

【讨论】:

  • 这个,以及所有其他答案,改变提示颜色,而不是错误状态的提示颜色
  • @MichelReap 你能详细说明你到底想要什么吗?有一些混乱。
  • 我想要谷歌在他的指导方针上声明的行为:提示在验证之前保持强调色,其中提示变为与下划线和错误消息相同的颜色。如果不是错误状态,那么颜色就是重音。
  • @MichelReap 表示您想要的是,当发生任何错误时,最初的提示颜色是重音,然后 line 、 error 和 hint 所有颜色都相同,即灰色。在所有其他情况下,提示仍然是重音。
【解决方案3】:
  1. Xml 中的TextInputLayout

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:id="@+id/tx_login_password"
            app:errorEnabled="true"
            style="@style/text_input_style"
            app:passwordToggleEnabled="true"
            app:hintTextAppearance="@style/text_Apearence"
            android:layout_below="@id/tx_login_username"
            android:layout_centerHorizontal="true"
            app:theme="@style/Theme.App.Base"
            android:layout_marginLeft="70dp"
            android:layout_marginStart="70dp"
            android:layout_marginRight="70dp"
            android:layout_marginEnd="70dp"
            app:errorTextAppearance="@style/text_Apearence"
            android:layout_height="wrap_content">
            <android.support.v7.widget.AppCompatEditText
                android:layout_width="match_parent"
                android:layout_marginTop="10dp"
                android:layout_height="wrap_content"
                android:hint="Password"
                android:paddingTop="5dp"
                android:typeface="sans"
                android:textStyle="bold"
                android:textSize="15sp"
                android:maxLines="1"
                android:inputType="textPassword"
                android:lines="1"
                android:elegantTextHeight="true"
                android:textAlignment="viewStart"
                android:layout_gravity="start"
                android:id="@+id/password"
                android:theme="@style/Theme.App.Base"
                app:theme="@style/Theme.App.Base"
                style="@style/EditText_style"
                />
        </android.support.design.widget.TextInputLayout>
    
  2. 来自资源的 style.xml 文件中的 text_Apearence

<style name="text_Apearence" parent="TextAppearance.Design.Hint">
    <item name="android:textSize">15sp</item>
        <item name="textColor">@color/react_blue</item>
        <item name="android:colorActivatedHighlight">@color/react_blue</item>
        <item name="android:colorControlActivated">@color/react_blue</item>
    </style>
   

 1.  3. Style for Text Input Layout text_input_style XML file

<!-- begin snippet: js hide: false console: true babel: false -->
  1. 文本输入布局 text_input_style XML 文件的样式

<style name="text_Apearence" parent="TextAppearance.Design.Hint">
    <item name="android:textSize">15sp</item>
        <item name="textColor">@color/react_blue</item>
        <item name="android:colorActivatedHighlight">@color/react_blue</item>
        <item name="android:colorControlActivated">@color/react_blue</item>
    </style>

Image Looks Like

【讨论】:

    【解决方案4】:

    <style name="text_Apearence" parent="TextAppearance.Design.Hint">
        <item name="android:textSize">15sp</item>
            <item name="textColor">@color/react_blue</item>
            <item name="android:colorActivatedHighlight">@color/react_blue</item>
            <item name="android:colorControlActivated">@color/react_blue</item>
        </style>
       
    
     

    【讨论】:

    • colorActivatedHighlight 和 colorControlActivated 是主题属性。这些需要在主题中设置。
    【解决方案5】:

    现在这是默认行为。要实现这一点,只需将您的支持库版本更新到 28+。

    implementation 'com.android.support:design:28.0.0'
    

    【讨论】:

      【解决方案6】:

      您可以使用“helperTextTextColor”属性来执行此操作。

      <com.google.android.material.textfield.TextInputLayout
                  app:hintTextColor="@color/color_login_text_hint"
                  app:helperTextTextColor="@color/error_color">
      </com.google.android.material.textfield.TextInputLayout>
      

      【讨论】:

        【解决方案7】:

        这是另一种你可以尝试的方法

        fun wrapInCustomStyle(myText: String): Spannable? {
        val spannable = SpannableString(myText) Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        
        //Test 'Alignment.ALIGN_OPPOSIT' Too if not working
        
        spannable.setSpan(
        
            AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL), 0,
            myText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        ) 
        return spannable
        

        }

        InputLayout.error=wrapInCustomStyle("sample")
        

        【讨论】:

          【解决方案8】:

          我们可以将错误作为帮助文本进行处理,因为如果设置错误肯定会改变提示颜色,所以我只使用了helperText 而不是setError,这是一个示例

          XML 文件

          <com.google.android.material.textfield.TextInputLayout
                            android:id="@+id/textInputLayoutUserName"
                            android:layout_width="@dimen/view_0x"
                            android:layout_height="wrap_content"
                            style="@style/errorEnabledtextInputLayoutStyle">
              
                               <EditText
                                     android:id="@+id/editTextUserName"
                                     android:gravity="center_vertical"
                                     android:background="@drawable/edit_text_background"
                                     android:backgroundTint="@color/colorGray"
                                     android:hint="@string/aap_ka_naam"
                                     android:singleLine="true"
                                     style="@style/standardTextViewStyle"
                                     tools:targetApi="lollipop"
                                     app:layout_constraintHorizontal_bias="0.0"/>
              
          </com.google.android.material.textfield.TextInputLayout>
          

          edit_text_background.xml

          <?xml version="1.0" encoding="utf-8"?>
          <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
               <item android:top="-3dp" android:left="-3dp" android:right="-3dp">
                  <shape android:shape="rectangle">
                         <stroke android:width="1dp" android:color="@color/colorWhite" />
                         <padding android:bottom="50dp" android:top="10dp" android:right="10dp"android:left="5dp"/>
                         <solid android:color="#00000000" />
                  </shape>
               </item>
          </layer-list>
          

          样式

          <style name="errorEnabledtextInputLayoutStyle">
                  <item name="hintTextColor">@color/colorGraySix</item>
                  <item name="helperTextTextColor">@color/colorNegative</item>
                  <item name="hintEnabled">true</item>
          </style>
          

          功能

          fun TextInputLayout.setErrorText(error : String, editText: EditText) {
               this.helperText = error
               editText.backgroundTintList = ColorStateList.valueOf(
                      ResourcesCompat.getColor(resources,
                      R.color.colorNegative, null)
                )
          }
          

          用法

          textInputLayoutUserName.setErrorText(getString(R.string.name_error), editTextUserName)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-22
            • 2020-06-05
            相关资源
            最近更新 更多