HarmonyOS 鸿蒙Next中为啥直接用$r取出来的是一个对象?

HarmonyOS 鸿蒙Next中为啥直接用$r取出来的是一个对象? 在鸿蒙(HarmonyOS)ArkTS开发中,获取资源文件中的文字需通过资源组目录中的字符串资源文件(string.json)实现,具体步骤如下:

  1. 创建字符串资源文件 在 resources/base/element/ 目录下创建 string.json 文件(若不存在需新建),内容格式如下:
{
  "string": [
    {
      "name": "hello_text", // 资源ID
      "value": "你好,世界!" // 文字内容
    },
    {
      "name": "welcome_text",
      "value": "欢迎使用鸿蒙应用"
    }
  ]
}

2. 在代码中引用文字资源

// 获取字符串资源
let helloText: string = $r('app.string.hello_text'); // 方式1:直接使用$r
let welcomeText: string = this.context.resourceManager.getStringSync($r('app.string.welcome_text').id); // 方式2:通过资源管理器

3. 在UI组件中使用

直接在文本组件中绑定资源ID:

Text($r('app.string.hello_text')) // 显示"你好,世界!"
  .fontSize(20)

📌 关键说明

  • 文件位置:字符串资源必须放在 resources/base/element/string.json 或限定词目录(如 resources/zh_CN/element/string.json)中。
  • 资源访问规则:使用 app.string.[资源ID] 格式(如 app.string.hello_text)。
  • 多语言适配:为不同语言创建限定词目录(如 en_GB/element/string.json),系统会根据设备语言自动匹配。

⚠️ 注意:若需访问 rawfile 目录下的原始文本文件(如 .txt),需通过文件路径读取(非推荐方式),但字符串资源管理应优先使用 string.json。


更多关于HarmonyOS 鸿蒙Next中为啥直接用$r取出来的是一个对象?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

getStringByNameSync

支持设备PhonePC/2in1TabletTVWearable

getStringByNameSync(resName: string, …args: Array<string | number>): string

获取指定资源名称对应的字符串,并根据args参数对字符串进行格式化,使用同步方式返回。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Global.ResourceManager

参数:

参数名 类型 必填 说明
resName string 资源名称。
…args Array<string | number> 格式化字符串资源参数。
支持参数类型:%d、%f、%s、%%、%数字$d、%数字$f、%数字$s。
说明:%%转义为%; %数字$d中的数字表示使用args中的第几个参数。
举例:%%d格式化后为%d字符串; %1$d表示使用第一个参数。

返回值:

类型 说明
string 资源名称对应的格式化字符串。
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
      try {
          // "test"仅作示例,请替换为实际使用的资源
          let testStr = this.context.resourceManager.getStringByNameSync("test", "format string", 10, 98.78);
          console.log(`getStringByNameSync, result: ${testStr}`);
          // 打印输出结果: getStringByNameSync, result: I'm a format string, format int: 10, format float: 98.78.
      } catch (error) {
          let code = (error as BusinessError).code;
          let message = (error as BusinessError).message;
          console.error(`getStringByNameSync failed, error code: ${code}, message: ${message}.`);
      }
  }
}

更多关于HarmonyOS 鸿蒙Next中为啥直接用$r取出来的是一个对象?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,$r是资源引用方法,用于访问应用内定义的资源。当使用$r('app.type.name')形式调用时,系统返回的是Resource对象而非直接资源值。这是因为鸿蒙采用统一资源管理机制,Resource对象封装了类型、ID及多设备适配信息,支持运行时根据上下文动态解析。要获取具体资源值,需调用对象对应方法,例如字符串资源用$r('app.string.xxx').getString()。这种设计便于资源统一管理和跨设备适配。

在HarmonyOS Next中,$r('app.string.hello_text')返回的是Resource对象而非直接字符串,这是设计上的改变。Resource对象包含资源ID、类型等元数据,需要调用其value属性获取实际字符串值。

正确的用法应该是:

let helloText: string = $r('app.string.hello_text').value;

或者在UI组件中直接使用:

Text($r('app.string.hello_text').value)
  .fontSize(20)

这种设计提供了更好的类型安全和资源管理,允许在编译时检查资源引用,避免运行时错误。Resource对象还支持其他属性访问,如id、type等,便于更灵活的资源处理。

对于需要直接字符串的场景,始终需要通过.value属性获取实际内容。

回到顶部