当前位置: 首页 > news >正文

react native for OpenHarmony iconfont 图标不显示难题

react native for OpenHarmony iconfont 图标不显示难题

问题描述

在 OpenHarmony 5.0.0.71 上安装应用后,iconfont 图标完全不显示。困扰了我好几天!!

根本原因

在 HarmonyOS/OpenHarmony 中使用自定义字体(包括 IconFont),必须在 ArkTS 侧显式注册字体。仅靠 font.json 配置文件是不够的,这是与 Android/iOS 最大的区别。

根据 Ant Design Mobile RN 官方文档(Badge 组件示例),字体必须通过以下两步配置:

  1. resources/base/profile/font.json 中声明字体
  2. Index.etsRNApp 配置中通过 fontResourceByFontFamily 显式注册

正确的修复方案

1. 字体文件位置

确保字体文件在正确位置:

harmony/entry/src/main/resources/rawfile/iconfont.ttf

2. 创建字体配置文件

位置harmony/entry/src/main/resources/base/profile/font.json

内容

{
"font": [
{
"name": "iconfont",
"file": "rawfile/iconfont.ttf"
}
]
}

关键点

  • file 路径必须是 rawfile/iconfont.ttf(相对于 resources 目录)
  • name 字段必须与后续 React Native 中使用的 fontFamily 一致

3. 在 Index.ets 中注册字体(关键步骤)

位置harmony/entry/src/main/ets/pages/Index.ets

修改内容

RNApp({
rnInstanceConfig: {
createRNPackages,
enableNDKTextMeasuring: true,
enableBackgroundExecutor: false,
enableCAPIArchitecture: true,
arkTsComponentNames: [],
// ⚠️ 关键:必须显式注册字体资源
fontResourceByFontFamily: {
'iconfont': $rawfile("iconfont.ttf"),
}
},
// ...其他配置
})

说明

  • fontResourceByFontFamily 是必需的,这是 HarmonyOS 加载自定义字体的核心机制
  • 键名 'iconfont' 必须与 font.json 中的 name 字段一致
  • $rawfile("iconfont.ttf") 直接引用 rawfile 目录下的文件

4. React Native 组件使用

IconFont.tsx

const IconFont: React.FC<IconFontProps> = ({ name, size = 16, color = '#000', style }) => {const iconCode = IconFontMap[name];// fontFamily 必须与 font.json 和 Index.ets 中注册的名称完全一致const fontFamily = Platform.select({harmony: 'iconfont',android: 'iconfont',ios: 'iconfont',default: 'iconfont',});return (<Textstyle={[{fontFamily: fontFamily,fontSize: size,color: color,includeFontPadding: false,textAlignVertical: 'center',},style,]}allowFontScaling={false}>{iconCode}</Text>);};

最终目录结构

harmony/entry/src/main/
├── ets/pages/
│   └── Index.ets  ✅ 在此注册 fontResourceByFontFamily
├── resources/
│   ├── base/profile/
│   │   └── font.json  ✅ 字体配置文件
│   └── rawfile/
│       └── iconfont.ttf  ✅ 字体文件

关键要点

  1. 双重配置机制

    • font.json:声明字体元数据
    • Index.ets 中的 fontResourceByFontFamily:实际加载字体资源
  2. 路径一致性

    • font.json 中:"file": "rawfile/iconfont.ttf"(相对路径)
    • Index.ets 中:$rawfile("iconfont.ttf")(直接引用)
  3. 名称一致性

    • font.json 中的 name
    • Index.etsfontResourceByFontFamily 的键名
    • React Native 组件中的 fontFamily
    • 三者必须完全一致
  4. 不需要手动调用 API

    • 不需要在 EntryAbility.ets 中使用 font.registerFont()
    • 不需要在 Index.ets 的 aboutToAppear 中手动注册
    • 通过 fontResourceByFontFamily 配置即可自动加载

常见错误

❌ 错误做法 1:只配置 font.json

// 只有这个配置是不够的
{
"font": [{"name": "iconfont", "file": "rawfile/iconfont.ttf"}]
}

❌ 错误做法 2:font.json 路径错误

{
"font": [
{"name": "iconfont", "file": "font/iconfont.ttf"}  // ❌ 错误路径
]
}

❌ 错误做法 3:缺少 fontResourceByFontFamily

RNApp({
rnInstanceConfig: {
createRNPackages,
enableNDKTextMeasuring: true,
// ❌ 缺少 fontResourceByFontFamily 配置
arkTsComponentNames: []
},
})

✅ 正确做法:双重配置

// font.json
{
"font": [{"name": "iconfont", "file": "rawfile/iconfont.ttf"}]
}
// Index.ets
RNApp({
rnInstanceConfig: {
// ...
fontResourceByFontFamily: {
'iconfont': $rawfile("iconfont.ttf"),
}
},
})

测试步骤

# 1. 清理并重新构建
cd harmony
hvigorw clean
hvigorw assembleHap
# 2. 安装到设备并测试图标显示

参考资料

  1. Ant Design Mobile RN 官方文档

    • Badge 组件示例中的字体配置方法
    • 明确要求在 Index.ets 中使用 fontResourceByFontFamily 注册字体
  2. OpenHarmony 字体系统

    • font.json:声明性配置
    • fontResourceByFontFamily:实际资源绑定

版本信息

总结

核心原理:HarmonyOS 的字体加载采用"声明 + 注册"的双重机制,缺一不可。这与 Android/iOS 只需将字体文件放入指定目录即可使用的方式完全不同。理解这一点是解决问题的关键。

http://www.jsqmd.com/news/355861/

相关文章:

  • 平衡树 Treap
  • 压力型白发哪家机构能治好?黑奥秘四大专利成分矩阵,精准解决白发根源
  • 模拟退火/随机化
  • 旅游管理系统|基于SpringBoot和Vue的旅游管理系统(源码+数据库+文档) - 详解
  • Base64 编码详解:原理、用途与实现
  • Zstandard(zstd)压缩算法及其使用
  • 消除FFmpeg库的SONAME依赖 - 实践
  • Python 文件读写
  • 文件上传与优化
  • 【小程序毕设全套源码+文档】基于Android的多功能智能手机阅读APP(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设源码分享】基于springboot+android的电子书阅读器系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 解析AI Agent架构在RK3588上的NPU/CPU/GPU映射,实现高效嵌入式AI部署
  • 北方华创芯片工业软件界面设计
  • 豆包生成带复杂公式的文件如何导出到Word文档
  • Barricades
  • OpenClaw可以接入飞书啦!Windows+Ollama+飞书搞了两天,我也有了贴身AI小助手
  • 1981-2024年各城市逐日、逐月、逐年平均气温数据shp格式
  • AUTOSAR Adaptive中应用容器Crash如何恢复?
  • C++ lambda 捕获导致性能问题有哪些典型案例
  • P9523 [JOIST 2022] 复制粘贴 3 / Copy and Paste 3
  • Python 潮流周刊#139:为什么人们总想取代数据分析师?
  • 2026年技术趋势预判:这 5 个方向正在爆发,提前布局的人已经吃到红利了
  • 我用 Python 把 Claude 变成了 “代码审查员“:每次提交前 AI 先 Review,Bug 漏网率降了 80%
  • 大数据领域数据架构的构建方法与实践
  • 提示工程敏捷管理工具选型指南:架构师教你3步选对适合团队的工具
  • WGD分类进阶--随笔021
  • 2025-2026 南京青岛特辑 随便做做
  • Flink JobManager 高可用(High Availability)原理、组件、数据生命周期与 JobResultStore 实战
  • Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优