HarmonyOS 鸿蒙Next中属性文本在6.0及以上版本设置字体颜色失效
HarmonyOS 鸿蒙Next中属性文本在6.0及以上版本设置字体颜色失效 属性文本,通过setStyle 这设置文本样式,里面fontColor属性 读取本地资源文件 在6.0以前版本都还是正常的,6.0就只会展示黑色了。
这边使用官方示例3设置文本样式,改为$r(‘app.color.xxxxx’)并没有该问题,使用代码点击更新样式后可以整更新,IDE为6.0 beta3版本,手机系统为6.0.0.107版本,代码如下:
// xxx.ets
import { LengthMetrics, LengthUnit } from '@kit.ArkUI';
@Entry
@Component
struct styled_string_set_text_style_demo {
fontStyleAttr1: TextStyle = new TextStyle({ fontColor: Color.Blue });
fontStyleAttr2: TextStyle = new TextStyle({
fontColor: Color.Orange,
fontSize: LengthMetrics.vp(20),
fontWeight: FontWeight.Bolder,
fontStyle: FontStyle.Italic,
fontFamily: "Arial",
superscript: SuperscriptStyle.SUPERSCRIPT
});
fontStyleAttr3: TextStyle = new TextStyle({
fontColor: Color.Orange,
fontSize: LengthMetrics.vp(20),
fontWeight: FontWeight.Lighter,
fontStyle: FontStyle.Italic,
fontFamily: "Arial",
superscript: SuperscriptStyle.SUBSCRIPT
});
// 创建多重TextStyle样式的对象mutableStyledString1
mutableStyledString1: MutableStyledString = new MutableStyledString("运动45分钟", [{
start: 0,
length: 2,
styledKey: StyledStringKey.FONT,
styledValue: this.fontStyleAttr3
}, {
start: 2,
length: 2,
styledKey: StyledStringKey.FONT,
styledValue: this.fontStyleAttr2
}
]);
// 创建有多种样式组合对象mutableStyledString2
mutableStyledString2: MutableStyledString = new MutableStyledString("test hello world", [{
start: 0,
length: 5,
styledKey: StyledStringKey.FONT,
styledValue: this.fontStyleAttr1
}, {
start: 0,
length: 5,
styledKey: StyledStringKey.DECORATION,
styledValue: new DecorationStyle({ type: TextDecorationType.LineThrough, color: Color.Blue })
}, {
start: 0,
length: 5,
styledKey: StyledStringKey.TEXT_SHADOW,
styledValue: new TextShadowStyle({
radius: 5,
type: ShadowType.COLOR,
color: Color.Yellow,
offsetX: 10,
offsetY: -10
})
}, {
start: 0,
length: 5,
styledKey: StyledStringKey.BASELINE_OFFSET,
styledValue: new BaselineOffsetStyle(LengthMetrics.px(20))
}, {
start: 0,
length: 5,
styledKey: StyledStringKey.LETTER_SPACING,
styledValue: new LetterSpacingStyle(new LengthMetrics(10, LengthUnit.VP))
}, {
start: 6,
length: 5,
styledKey: StyledStringKey.BASELINE_OFFSET,
styledValue: new BaselineOffsetStyle(LengthMetrics.fp(10))
}
]);
@State fontColor1: ResourceColor = Color.Red;
controller: TextController = new TextController();
options: TextOptions = { controller: this.controller };
controller2: TextController = new TextController();
spanStyle1: SpanStyle = {
start: 0,
length: 5,
styledKey: StyledStringKey.FONT,
styledValue: new TextStyle({ fontColor: $r('app.color.color_red') })
};
async onPageShow() {
this.controller.setStyledString(this.mutableStyledString1);
this.controller2.setStyledString(this.mutableStyledString2);
}
build() {
Column() {
Column({ space: 10 }) {
// 显示配了字体各种样式的属性字符串,Text组件亦配置冲突部分生效属性字符串配置,未冲突区间生效Text组件属性设置值
Text(undefined, this.options)
.fontColor(this.fontColor1)
.font({ size: 20, weight: 500, style: FontStyle.Normal })
// 显示配置了文本阴影、划线、字符间距、基线偏移量的属性字符串,Text组件亦配置生效属性字符串配置
Text(undefined, { controller: this.controller2 })
.fontSize(30)
.copyOption(CopyOptions.InApp)
.draggable(true)
.decoration({ type: TextDecorationType.Overline, color: Color.Pink })
.textShadow({
radius: 10,
type: ShadowType.COLOR,
color: Color.Green,
offsetX: -10,
offsetY: 10
})
Button('查询字体样式')
.onClick(() => {
let styles = this.mutableStyledString1.getStyles(0, this.mutableStyledString1.length);
if (styles.length !== 0) {
for (let i = 0; i < styles.length; i++) {
console.info('mutableStyledString1 style object start:' + styles[i].start);
console.info('mutableStyledString1 style object length:' + styles[i].length);
console.info('mutableStyledString1 style object key:' + styles[i].styledKey);
if (styles[i].styledKey === 0) {
let fontAttr = styles[i].styledValue as TextStyle;
console.info('mutableStyledString1 fontColor:' + fontAttr.fontColor);
console.info('mutableStyledString1 fontSize:' + fontAttr.fontSize);
console.info('mutableStyledString1 fontWeight:' + fontAttr.fontWeight);
console.info('mutableStyledString1 fontStyle:' + fontAttr.fontStyle);
console.info('mutableStyledString1 fontFamily:' + fontAttr.fontFamily);
console.info('mutableStyledString1 superscript:' + fontAttr.superscript);
}
}
}
})
.margin({ top: 10 })
Button('查询其他文本样式')
.onClick(() => {
let styles = this.mutableStyledString2.getStyles(0, this.mutableStyledString2.length);
if (styles.length !== 0) {
for (let i = 0; i < styles.length; i++) {
console.info('mutableStyledString2 style object start:' + styles[i].start);
console.info('mutableStyledString2 style object length:' + styles[i].length);
console.info('mutableStyledString2 style object key:' + styles[i].styledKey);
if (styles[i].styledKey === 1) {
let decoAttr = styles[i].styledValue as DecorationStyle;
console.info('mutableStyledString2 decoration type:' + decoAttr.type);
console.info('mutableStyledString2 decoration color:' + decoAttr.color);
}
if (styles[i].styledKey === 2) {
let baselineAttr = styles[i].styledValue as BaselineOffsetStyle;
console.info('mutableStyledString2 baselineOffset:' + baselineAttr.baselineOffset);
}
if (styles[i].styledKey === 3) {
let letterAttr = styles[i].styledValue as LetterSpacingStyle;
console.info('mutableStyledString2 letterSpacing:' + letterAttr.letterSpacing);
}
if (styles[i].styledKey === 4) {
let textShadowAttr = styles[i].styledValue as TextShadowStyle;
let shadowValues = textShadowAttr.textShadow;
if (shadowValues.length > 0) {
for (let j = 0; j < shadowValues.length; j++) {
console.info('mutableStyledString2 textShadow type:' + shadowValues[j].type);
console.info('mutableStyledString2 textShadow radius:' + shadowValues[j].radius);
console.info('mutableStyledString2 textShadow color:' + shadowValues[j].color);
console.info('mutableStyledString2 textShadow offsetX:' + shadowValues[j].offsetX);
console.info('mutableStyledString2 textShadow offsetY:' + shadowValues[j].offsetY);
}
}
}
}
}
})
.margin({ top: 10 })
Button('更新mutableStyledString1样式')
.onClick(() => {
this.mutableStyledString1.setStyle(this.spanStyle1);
this.controller.setStyledString(this.mutableStyledString1);
})
.margin({ top: 10 })
}.width('100%')
}
.width('100%')
}
}
如果不行麻烦提供下:
1.可复现的demo。
2.当前使用的IDE版本和手机系统版本号。
更多关于HarmonyOS 鸿蒙Next中属性文本在6.0及以上版本设置字体颜色失效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
用预览器试的吗?用真机或者模拟器再试试?
或者有没有相应复现代码。
真机
在HarmonyOS Next 6.0及以上版本,属性文本(Text组件)设置字体颜色失效,可能是由于API变更或渲染机制调整。请检查代码中fontColor或textColor属性是否使用正确,并确认是否应用了新的主题或样式系统。建议查阅对应版本的HarmonyOS SDK API文档,确认相关属性的正确用法。
在HarmonyOS Next 6.0及以上版本中,属性文本(AttributeText)的setStyle方法内fontColor属性失效,通常是由于资源引用方式或API变更导致。
主要原因及解决方案:
-
资源引用方式变更
HarmonyOS Next 6.0对资源管理进行了优化,可能调整了颜色资源的引用路径或解析逻辑。
检查点:- 确认颜色资源定义在
resources/base/element/color.json中。 - 使用
$r('app.color.xxx')或ResourceColor正确引用,而非直接使用资源ID数值。
- 确认颜色资源定义在
-
API使用规范
setStyle中的fontColor需传入ResourceColor对象。示例:// 正确方式 attributeText.setStyle({ fontColor: $r('app.color.my_text_color') }); -
框架兼容性
6.0版本可能强化了类型校验,若传入非法的颜色值(如字符串或错误类型),会默认显示黑色。请确保传入值符合ResourceColor类型。 -
临时解决方案
如急需修复,可尝试直接使用颜色值(不推荐长期使用):attributeText.setStyle({ fontColor: '#FF0000' // 或 Color.Red });
建议排查步骤:
- 对比5.0与6.0的SDK文档中
AttributeText.setStyle的接口定义差异。 - 检查颜色资源文件是否被正确打包到HAP中。
- 使用动态调试输出颜色值,确认资源是否成功解析。
该问题通常通过修正资源引用代码即可解决,无需降级版本。

