以编程方式设置TextInputLayout提示文本颜色和浮动标签颜色

时间:2016-02-28 13:55:10

标签: android android-textinputlayout

我使用TextInputLayout,如果输入字段是必需的,我想以编程方式设置提示文本颜色和浮动标签颜色。在移动到TextInputLayout之前,我曾使用以下

以编程方式设置提示文本颜色

textField.setHintTextColor(Color.RED);

有人可以指导我如何以编程方式为TextInputLayout设置提示文本颜色和浮动标签颜色。

在附带的屏幕截图中,我希望提示文字地址1 在未聚焦时为红色,浮动标签地址1 的焦点应为红色。

enter image description here

8 个答案:

答案 0 :(得分:14)

我用反射改变了聚焦色。这是可以帮助某人的片段。

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();
    }
}

编辑2018-08-01:

如果您使用的是设计库v28.0.0及更高版本,则字段已从mDefaultTextColor更改为defaultHintTextColor,从mFocusedTextColor更改为focusedTextColor

检查反编译类的其他字段。

答案 1 :(得分:4)

请仔细查看此处的文档:TextInputLayout Methods

有一种方法:

setHintTextAppearance(int resId)

其中包含可能是颜色资源的资源ID!

我会尝试这个,看看它是怎么回事!

我希望它可以帮到你!

答案 2 :(得分:3)

通常TextInputLayout提示文字颜色来自app的colorAccent。

但是如果你想改变那么你可以使用风格。

<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>

但是如果你想添加红色,那么如何区分错误颜色意味着基本标准错误有红色。

  

textField.setHintTextColor(Color.RED);有人可以指导我如何做   以编程方式设置提示文本颜色和浮动标签颜色   对于TextInputLayout。

setHintTextColor适用于API 23 +

答案 3 :(得分:3)

更改TextInput布局的Focused ColorDefault Text Color

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();
    }
}

编辑:更改AppCompactEditText线条颜色

您需要将backgroundTintList上的supportBackgroundTintList(或EditText)设置为ColorStateList的实例,其中仅包含您要将色调更改为的颜色。以向后兼容的方式执行此操作的简单方法如下所示:

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

这将为EditText提供所需的下划线颜色。

答案 4 :(得分:2)

通过Material Components library,您可以使用:

在布局中:

<com.google.android.material.textfield.TextInputLayout
    app:hintTextColor="@color/mycolor"
    android:textColorHint="@color/text_input_hint_selector"
    .../>

样式:

<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
    <!-- The color of the label when it is collapsed and the text field is active -->
    <item name="hintTextColor">?attr/colorPrimary</item>
    <!-- The color of the label in all other text field states (such as resting and disabled) -->
    <item name="android:textColorHint">@color/mtrl_indicator_text_color</item>
</style>

在代码中:

// Sets the text color used by the hint in both the collapsed and expanded states
textInputLayout.setDefaultHintTextColor(...);

//Sets the collapsed hint text color
textInputLayout.setHintTextColor(....);

答案 5 :(得分:0)

让我分享我的经验。我还尝试了与此相关的每个问题中的所有解决方案。即将子窗口小部件的提示颜色更改为destroy()

我很高兴与大家分享这个问题的答案。

我们需要知道的是:-

  1. TextInputLayout或其子窗口小部件的样式下面添加一行并没有太大帮助。

    <项目名称=“ android:textColorHint”> @ color / white

    因为它将在接收到焦点或将焦点授予可编辑小部件时使用colorAccent。

  2. 此问题的实际答案是在Application的样式标签中添加该样式行,当该样式行或任何可编辑区域不清晰时,它将通过该行设置提示颜色。 (这就是我们每次都想念的地方)。

请告知我们是否还有其他信息。

谢谢!

答案 6 :(得分:0)

我面临着同样的问题,但提示和颜色符号都变了。我通过数据绑定和Spannable来达到这个目的。

 <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/ti_last_name"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginTop="4dp"
                android:layout_marginEnd="8dp"
                app:boxStrokeWidth="0dp"
                app:boxStrokeWidthFocused="0dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.5"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/et_last_name"
                    style="@style/EditText"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:onFocusChangeListener="@{viewModel.onFocusChangeListener(@string/last_name)}"
                    tools:hint="@string/last_name" />
</com.google.android.material.textfield.TextInputLayout>

viewModel.onFocusChangeListener以此方式定义

    fun onFocusChangeListener(hint: String) =
        OnFocusChangeListener { view, isFocused ->
            (view.parent.parent as TextInputLayout).apply {
                val editText = (view as TextInputEditText)
                if (isFocused) {
                    this.hintTextColor = ColorStateList.valueOf(this.getColor(R.color.black))
                    editText.hint = ""
                    this.hint = hint
                } else {
                    if (!editText.text.isNullOrBlank()) {
                        this.defaultHintTextColor = ColorStateList.valueOf(this.getColor(R.color.black))
                        editText.hint = ""
                        this.hint = hint
                    } else {
                        this.hintTextColor = ColorStateList.valueOf(this.getColor(R.color.hint_color))
                        val builder = SpannableStringBuilder()
                        builder.append(hint)
                        val start = builder.length
                        val end = start + 1
                        builder.append("\u2981")
                        builder.setSpan(
                            ForegroundColorSpan(Color.RED),
                            start,
                            end,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                        )
                        builder.setSpan(
                            SuperscriptSpan(),
                            start,
                            end,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                        )
                        editText.hint = builder
                        this.hint = ""
                    }
                }
            }

        }

允许针对聚焦状态/非聚焦状态使用不同的提示和颜色,并且具有彩色范围。

this.getColor()只是扩展名

 fun View.getColor(color: Int): Int {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        this.context.resources.getColor(color, context.theme)
    } else {
        this.context.resources.getColor(color)
    }

答案 7 :(得分:-4)

我可以使用以下

将FloatingLabel变为红色
textInputLayout.setErrorEnabled(true);
textInputLayout.setError(" ");

enter image description here