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
相关产品推荐
相关产品推荐

