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

如何在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里使用:

  1. 在res/values/colors.xml中定义颜色:
    <color name="BadColour">#ff0000</color>
    
  2. 在styles.xml中引用这个颜色资源:
    <style name="AppTheme" parent="android:Theme.Holo.NoActionBar">
        <item name="BadColour">@color/BadColour</item>
    </style>
    
  3. 最后在strings.xml里用@color/BadColour引用:
    <string name="your_string">普通文本 <font color="@color/BadColour">变色文本</font> 普通文本</string>
    

方案2:代码动态设置(主题切换场景)

如果你的颜色需要随主题动态变化(比如深色/浅色主题切换),那只能通过代码实现:

  1. 从当前主题中获取颜色值:
    int badColor = ContextCompat.getColor(this, R.attr.BadColour);
    
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:53:18