获取Theme中Attr属性的Color值

前言

在做多套主题切换时,个别View是在代码中创建的,切换不同主题时,无法直接获取到自定义的 attr 属性的 color 值,在网上看了大多数使用新建一个 TypedValue 对象,然后使用 context.theme.resolveAttribute 函数将color值复制到 TypedValue 对象中,通过 typedValue.data 的方式获取,但是这种仅仅局限于当前上下文环境下的 Theme 属性,切换其他 Theme 后就不会生效,翻看了下 Material 的包,发现源码中已经提供了现成的函数给我们使用。


Theme定义

继承 Theme.MaterialComponents.DayNight.NoActionBar 主题,自定义 colorAccent 属性色值。

    <style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="textAllCaps">false</item>
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        
        <!--省略其他属性-->
        
        <item name="colorAccent">#546e7a</item>
    </style>

返回 ColorInt 类型值

@ColorInt
fun getThemeAttrColor(@NonNull context: Context, @StyleRes themeResId: Int, @AttrRes attrResId: Int): Int {
	return MaterialColors.getColor(ContextThemeWrapper(context, themeResId), attrResId, Color.WHITE)
}

返回 ColorStateList 类型值

fun getThemeAttrColor(@NonNull context: Context, @StyleRes themeResId: Int, @AttrRes attrResId: Int): ColorStateList {
	val color = MaterialColors.getColor(ContextThemeWrapper(context, themeResId), attrResId, Color.WHITE)
	return ColorStateList.valueOf(color)
}

使用

val color = getThemeAttrColor(context, R.style.AppTheme.NoActionBar, R.attr.colorAccent)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒙同學

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值