以编程方式将主题属性值中的颜色应用到 AppCompat TextView

Apply color from theme attr value to AppCompatTextView programatically

我正在尝试使用 setColor 方法设置 AppCompatTextView 的文本颜色,并在我的主题中提供来自自定义属性的颜色,但它似乎不起作用。

以下是我使用的确切代码

binding.loginTextTv.setTextColor(R.attr.primaryMainColor)

当我做类似

的时候它工作正常
binding.loginTextTv.setTextColor(R.color.primaryColor)

如何更改主题属性的颜色?

我的自定义属性看起来像

<resources>
  <attr name="primaryMainColor" type="color"/>
</resources>

你应该传递给那里的不是参考,而是像这样的颜色:
ContextCompat.getColor(context, R.color.primaryColor)

或者如果你想获得主题颜色,试试这个:

/**
 * Retrieves colors from theme attributes
 *
 * @throws Resources.NotFoundException Throws NotFoundException if the given ID does not exist.
 * @throws UnsupportedOperationException if the attribute is defined but is
 *         not an integer color or color state list.
 */
@ColorInt
@SuppressLint("Recycle")
fun Context.getThemeColor(@AttrRes colorAttrId: Int): Int {
  return obtainStyledAttributes(intArrayOf(colorAttrId))
    .use { it.getColor(0, Color.WHITE) }
}

drawable.setTint(requireContext().getThemeColor(android.R.attr.colorBackground))

或者可能是你的自定义属性不属于视图(它在遍历属性时没有在内部解析它) 因此,解决方案是从 AppCompatTextView 创建一个派生的 class 并在 init().

上解析您的自定义属性