以编程方式更改TextInputLayout的强调颜色

15
我有一个包含EditText视图的简单TextInputLayout。 现在我想知道如何以编程方式更改重点颜色(突出显示时的下划线和hintTextColor)。 我似乎找不到在TextInputLayout中合适的方法。 有什么建议吗?提前感谢您。
2个回答

19

我认为InputTextLayout无法在程序中更改标签颜色,因为它是由样式设置的。我检查了InputTextLayout的源代码,并编写了这个黑客帮助方法,它可以创建对私有颜色成员的访问:

public static void setInputTextLayoutColor(EditText editText, @ColorInt int color) {
    TextInputLayout til = (TextInputLayout) editText.getParent();
    try {
        Field fDefaultTextColor = TextInputLayout.class.getDeclaredField("mDefaultTextColor");
        fDefaultTextColor.setAccessible(true);
        fDefaultTextColor.set(til, new ColorStateList(new int[][]{{0}}, new int[]{ color }));

        Field fFocusedTextColor = TextInputLayout.class.getDeclaredField("mFocusedTextColor");
        fFocusedTextColor.setAccessible(true);
        fFocusedTextColor.set(til, new ColorStateList(new int[][]{{0}}, new int[]{ color }));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

mFocusedTextColor 用于设置内部的 CollapsingTextHelper.mCollapsedTextColor,该项用于设置标签的颜色。


1
可以确认,我已经查看了源代码,他们正在使用样式和属性,因此您无法通过编程来完成。这种基于反射的方法是您的最佳选择。另一个选项是复制类并添加帮助器方法以便能够通过编程方式设置颜色。 - ashishduh
1
请注意这段代码片段。它假设TextInputLayout将是EditText的父级。但并非总是如此,有时会有一个中间的FrameLayout。 - Graydyn Young
更改标签颜色完全正常。您知道如何更改下划线和光标颜色吗? - muthuraj
1
@muthuraj 如果要下划线,请尝试调用setSupportBackgroundTintList()方法。为了更改光标颜色,我也使用了访问https://dev59.com/uGw05IYBdhLWcg3wcRau#32474978中的私有成员的技巧。 - Petr Daňa
1
很遗憾,这在Support Library的28+版本中不起作用。 - afollestad
显示剩余5条评论

4
您可以尝试这个方法来处理这段文字:
InputTextLayout.getEditText().setHighlightColor(yourColor);
InputTextLayout.getEditText().setHintTextColor(yourColor);

这是用于EditText底部的行的代码。
Drawable background = InputTextLayout.getEditText().getBackground();
DrawableCompat.setTint(background, yourColor);
InputTextLayout.getEditText().setBackground(background);

希望它能正常工作!

2
@sud007 我也尝试了这个方法,确认它不起作用。你可以尝试我的解决方案(在这个问题中的答案),这对我很有效。 - Petr Daňa
这适用于背景颜色,但不适用于高亮和提示颜色。 - Julius

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