以编程方式更改TextInputLayout的提示颜色

6

我想要在程序中改变TextInputLayout的提示文字颜色。

当设置

 android:textColorHint="@color/redColor"

在xml中,一切都很顺利,我得到这样的结果: 在编辑时, 这就是我想要的,但我需要动态设置它。
现在,TextInputLayout没有setHintTextColor方法,但TextInputEditText有,所以我尝试使用以下方式:
editext.setHintTextColor(getColor(R.color.redColor))

但是这种方法无法与TextInputLayout的子项editext一起使用,因此尽管TextInputLayout支持"android:textColorHint"属性,但它不支持"setHintTextColor"方法。我寻找了其他的方法,发现有人建议使用预定义的样式中的"setHintTextAppearance",于是我试了一下,但结果如下所示:
普通状态: 聚焦状态:enter image description here 这是样式的具体内容:
<style name="AppRedText" parent="@android:style/TextAppearance">
    <item name="android:textColor">@color/redColor</item>
    <item name="android:textColorHint">@color/redColor</item>
    <item name="android:textSize">12sp</item>
</style>

我如何在程序中实现“android:textColorHint”属性的行为?

继承TextInputLayout并添加另一个方法以编程方式更改提示颜色 - Ganesh Tikone
你需要检查这个链接:https://dev59.com/Ul0a5IYBdhLWcg3wPWpN#30914037 - Mayur Patel
@Ganesh Tikon,您能详细说明在该方法中需要做什么吗? - antanas_sepikas
@Mayur Patel 这篇文章没有解释如何以编程方式实现。 - antanas_sepikas
请阅读一遍此内容:https://dev59.com/i1sV5IYBdhLWcg3w4iFA#53257526 - Harpreet
3个回答

22

我已经寻找解决方案很长时间了。 但最终找到了它! 原来它太容易了)

Kotlin版本:

private fun setTextInputLayoutHintColor(textInputLayout: TextInputLayout, context: Context, @ColorRes colorIdRes: Int) {
    textInputLayout.defaultHintTextColor = ColorStateList.valueOf(ContextCompat.getColor(context, colorIdRes))
}

最后:

setTextInputLayoutHintColor(textInputLayout, context, R.color.errorColor)

2
这就是我一直在寻找的解决方案! - Trevor
应该被接受!花了很多时间才找到这个! - Eugene Voronoy
在Android中,即使是非常小的问题,你也必须要花费很多时间去查找和搜索。这个Android SDK和开发真是令人沮丧。 - Muhammad Irfan

0

我已经找到了解决方案,可以更改TextInputLayout提示文本的颜色。

你可以像这样使用:

setUpperHintColor(ContextCompat.getColor(context,R.color.your_color_name));

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

你需要在EditText上设置backgroundTintList(或supportBackgroundTintList),并将其设置为一个ColorStateList实例,该实例仅包含您希望更改色调的颜色。以向后兼容的方式轻松完成此操作的方法如下:

ColorStateList colorStateList = ColorStateList.valueOf(ContextCompat.getColor(context,R.color.your_color_name))
editText.setSupportBackgroundTintList(colorStateList)

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

0

我在问题中提到,setHintTextAppearance未能按预期工作。 - antanas_sepikas
抱歉,是我的错误,请检查另一个链接。 - TheHound.developer
我还提到,如果EditText是TextInputLayout的子项,setHintTextColor将不起作用。第一个答案在该帖子中建议了这种方法。至于第二个答案,使用反射看起来真的很可怕。我认为这不是预期的方式。如果“mDefaultTextColor”在未来被重命名会发生什么?它是一个私有字段,不应从类外部访问。 - antanas_sepikas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接