HarmonyOS 鸿蒙Next中为啥直接用$r取出来的是一个对象?
HarmonyOS 鸿蒙Next中为啥直接用$r取出来的是一个对象? 在鸿蒙(HarmonyOS)ArkTS开发中,获取资源文件中的文字需通过资源组目录中的字符串资源文件(string.json)实现,具体步骤如下:
- 创建字符串资源文件 在 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
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属性获取实际内容。