如何在strings.xml中引用styles.xml的颜色值设置TextView文本颜色?
问题解答
不能直接在strings.xml的<font>标签里引用styles.xml中定义的自定义主题属性(比如你这里的BadColour)。
原因
<font>标签的color属性只支持三种取值:
- 十六进制颜色码(如
#ff0000) - 颜色资源的
@color/xxx引用 - 系统预设的颜色名称(如
red)
它并不支持?attr/xxx这种主题属性的引用方式,所以你之前试的几种写法都无效。
可行的替代方案
方案1:统一管理颜色资源(静态颜色场景)
把颜色值单独放到colors.xml中,这样既能在styles.xml里引用,也能在strings.xml里使用:
- 在
res/values/colors.xml中定义颜色:<color name="BadColour">#ff0000</color> - 在styles.xml中引用这个颜色资源:
<style name="AppTheme" parent="android:Theme.Holo.NoActionBar"> <item name="BadColour">@color/BadColour</item> </style> - 最后在strings.xml里用
@color/BadColour引用:<string name="your_string">普通文本 <font color="@color/BadColour">变色文本</font> 普通文本</string>
方案2:代码动态设置(主题切换场景)
如果你的颜色需要随主题动态变化(比如深色/浅色主题切换),那只能通过代码实现:
- 从当前主题中获取颜色值:
int badColor = ContextCompat.getColor(this, R.attr.BadColour); - 使用
SpannableString为指定文本段设置颜色:TextView textView = findViewById(R.id.your_text_view); String fullText = getString(R.string.your_string); SpannableString spannable = new SpannableString(fullText); // 假设要变色的文本是从索引2到8(根据实际需求调整) int startIndex = 2; int endIndex = 8; spannable.setSpan(new ForegroundColorSpan(badColor), startIndex, endIndex, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); textView.setText(spannable);
内容的提问来源于stack exchange,提问作者user204468
相关产品推荐
相关产品推荐

