You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android如何通过代码获取主题中自定义样式的属性值?

如何在Kotlin中获取主题里ListItem样式的属性值

要在代码中获取主题样式的属性值,你需要先把ListItem的属性定义为自定义主题属性,再将其与主题绑定,最后通过Context的主题API获取。具体步骤如下:

1. 定义自定义属性

在res/values/attrs.xml中创建(若不存在则新建)自定义属性,指定属性格式为color:

<resources>
    <attr name="listItemBackgroundColor" format="color" />
    <attr name="listItemTextColor" format="color" />
    <attr name="listItemStrokeColor" format="color" />
</resources>

2. 关联主题与自定义属性

修改你的主题文件,在基础主题Base.Theme.GuitarComposer中为自定义属性赋值,同时让ListItem样式引用这些主题属性(这样XML中使用ListItem时也能自动跟随主题变化):

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Base.Theme.GuitarComposer" parent="Theme.Material3.DayNight.NoActionBar">
        <!-- 为自定义属性绑定颜色资源 -->
        <item name="listItemBackgroundColor">@color/component_background</item>
        <item name="listItemTextColor">@color/text</item>
        <item name="listItemStrokeColor">@color/border_color</item>
    </style>

    <style name="ListItem">
        <!-- 引用主题中的自定义属性 -->
        <item name="android:background">?attr/listItemBackgroundColor</item>
        <item name="android:textColor">?attr/listItemTextColor</item>
        <item name="android:strokeColor">?attr/listItemStrokeColor</item>
    </style>

    <style name="Theme.GuitarComposer" parent="Base.Theme.GuitarComposer" />
</resources>

3. 在Kotlin代码中获取属性值

你可以通过两种方式获取属性值:

方式一:单个属性获取

val typedValue = TypedValue()
// 从主题中解析属性
theme.resolveAttribute(R.attr.listItemBackgroundColor, typedValue, true)
val bgColor = typedValue.data // 得到颜色的Int值

方式二:批量属性获取(推荐)

// 定义需要获取的属性数组
val attrs = intArrayOf(
    R.attr.listItemBackgroundColor,
    R.attr.listItemTextColor,
    R.attr.listItemStrokeColor
)

// 获取TypedArray
val typedArray = obtainStyledAttributes(attrs)
try {
    // 第二个参数为默认值,当属性未定义时使用
    val bgColor = typedArray.getColor(0, android.graphics.Color.WHITE)
    val textColor = typedArray.getColor(1, android.graphics.Color.BLACK)
    val strokeColor = typedArray.getColor(2, android.graphics.Color.GRAY)
    
    // 在这里使用获取到的颜色值
} finally {
    // 必须回收TypedArray,避免内存泄漏
    typedArray.recycle()
}

这种方式不仅能让你在代码中获取样式属性,还能自动适配日间/夜间主题的切换,因为主题会根据当前模式加载对应的属性值。

内容的提问来源于stack exchange,提问作者ODINN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:07:16