HarmonyOS鸿蒙Next中如何通过Resource获取资源名称

HarmonyOS鸿蒙Next中如何通过Resource获取资源名称 一个组件的某个属性定义为 str: ResourceStr,想通过str获取到传入的资源名称。例如str传入了$r(“app.media.icon_star”), 则需要获取到 “icon_star”

9 回复

尊敬的开发者,您好!该功能正在规划中,还请关注后续版本,感谢您的理解与支持。

更多关于HarmonyOS鸿蒙Next中如何通过Resource获取资源名称的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这是demo,后缀改为zip,使用release模式构建library后引用构建后的har再运行

尊敬的开发者,您好!该功能正在规划中,还请关注后续版本,感谢您的理解与支持。

尊敬的开发者,您好!

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便提供一下其他开发平台的实现方案或者接口(优先官方文档的内容)吗?如给您带来不便,敬请谅解。请您注意提供的内容不要包含您或第三方的非公开信息。

现在有个项目,打包时需要开启混淆,内部有个组件,组件有个属性aProp: ResourceStr,组件内部需要获取aProp的原始值,所以写了个方法getResourceValue

resourceManager = this.getUIContext().getHostContext()?.resourceManager

function getResourceValue(str: ResourceStr){
  if(typeof str === "string"){
    return str
  }
  return this.resourceManager.getStringSync(str.id)
}

但是文档说getStringSync不支持混淆,推荐我使用getStringByNameSync,所以需要改成

resourceManager = this.getUIContext().getHostContext()?.resourceManager

function getResourceValue(str: ResourceStr){
  if(typeof str === "string"){
    return str
  }
  return this.resourceManager.getStringByNameSync(str.resName)  // 假设有resName属性
}

所以需要获取传入的资源的名称。而且我觉得既然Resource是个对象,就应该有个resName属性。

目前HarmonyOS不支持获取$r(“app.media.icon_star”)资源的名称,

提上去,赶紧支持,

在HarmonyOS Next中,通过Resource对象获取资源名称,可以使用ResourceManager。首先获取资源管理器实例,然后调用getResourceName方法并传入资源ID。该方法会返回一个ResourceName对象,其中包含资源的类型、名称等信息。具体操作需在代码中导入ohos.global.resource相关模块。

在HarmonyOS Next中,可以通过ResourceManager解析Resource对象来获取资源名称。核心方法是使用getResourceName

具体实现如下:

import { resourceManager } from '@kit.ResourceManagerKit';

// 假设 str 是 ResourceStr 类型
async function getResourceName(str: ResourceStr): Promise<string | undefined> {
  try {
    // 将 ResourceStr 转换为 Resource 对象
    const resource: resourceManager.Resource = str as resourceManager.Resource;
    
    // 获取资源管理器实例
    const resMgr = resourceManager.getResourceManager();
    
    // 获取资源名称
    const resourceName = await resMgr.getResourceName(resource);
    
    // resourceName 格式通常为 "type/name",如 "media/icon_star"
    // 提取名称部分
    if (resourceName) {
      const parts = resourceName.split('/');
      return parts.length > 1 ? parts[1] : parts[0];
    }
  } catch (error) {
    console.error('Failed to get resource name:', error);
  }
  return undefined;
}

// 使用示例
const str = $r('app.media.icon_star');
const name = await getResourceName(str); // 返回 "icon_star"

关键点说明:

  1. ResourceStr类型实际对应resourceManager.Resource对象
  2. getResourceName()方法返回的是完整资源标识,格式为资源类型/资源名称
  3. 需要处理异步操作,相关API返回Promise

注意事项:

  • 确保在资源管理器的上下文中调用
  • 处理可能的异常情况
  • 返回的名称不包含应用模块前缀(如app.)和资源类型前缀,
回到顶部