首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙开发:那些常用的资源管理方法

鸿蒙开发:那些常用的资源管理方法

原创
作者头像
程序员一鸣
发布于 2025-05-20 13:24:41
发布于 2025-05-20 13:24:41
1100
举报

前言

本文基于Api13

在实际的开发中,我们经常会用到资源管理,比如常见的获取设备类型,获取屏幕方向,获取屏幕密度等等,除此之外,更多是获取资源已经配置好的内容,比如字符串,比如图片,比如数组资源,常见于指定类型不支持资源类型的参数。

正常情况下,我们在resources配置好的资源,是可以直接获取的,比如如下案例:

代码语言:typescript
AI代码解释
复制
{
      "name": "test_string",
      "value": "一个简单的测试数据"
    }

那么,在代码中,我们可以直接通过$r()进行获取:

代码语言:typescript
AI代码解释
复制
Text($r("app.string.test_string"))

我们可以直接这样获取,那是因为,$r()返回的是Resource,而Text组件的内容正好也支持Resource。

$r()源码如下:

代码语言:typescript
AI代码解释
复制
/**
 * global $r function
 *
 * @param { string } value
 * @param { any[] } params
 * @returns { Resource }
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @crossplatform
 * @form
 * @atomicservice
 * @since 11
 */
declare function $r(value: string, ...params: any[]): Resource;

Text组件源码如下:

代码语言:typescript
AI代码解释
复制
 /**
     * Called when writing text.
     *
     * @param { string | Resource } content
     * @param { TextOptions } value
     * @returns { TextAttribute }
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @crossplatform
     * @form
     * @atomicservice
     * @since 11
     */
    (content?: string | Resource, value?: TextOptions): TextAttribute;

那么问题来了,如果组件不支持Resource呢?显然这种情况下就不能直接使用$r()了;有的友友说了,不支持就不用呗,直接写死它不就行了,哎,直接写死,没有问题,对于自己写的,或者说没有规范的项目,你可以肆无忌惮,但是在规范严格的项目下,写死就会失去了代码复用,在日后更改文字的情况下,成本将会急剧上升,特别是那些国际化的项目,所以,一个统一资源输出的内容,可以有效地避免字符串硬编码,提高代码的可维护性、可读性和国际化能力。

针对不支持Resource类型参数的组件,我们就可以使用资源管理中方法来指定获取,还是上述的代码,我们就可以直接使用getStringSync来获取。

代码语言:typescript
AI代码解释
复制
Text(getContext().resourceManager.getStringSync($r("app.string.test_string").id))

需要注意的是,能用$r()获取的就用,不能用的情况下再去使用资源管理,通过排查,绝大部分文本组件都支持$r(),只有一少部分不支持,如:跑马灯组件、搜索Search组件,富文本RichText组件等等。

资源管理除了字符串的获取,还有很多可以获取,比如数组,比如图片等等,所以对于一些常量的属性,我们都可以定义到资源中去,通过资源管理来进行指定的获取,下面就一起看下资源管理中那些常见的方法。

一、使用方式

通过上下文context,我们就可以直接拿到resourceManager,如果你是在UI组件中,可以如下直接获取:

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager

二、获取设备屏幕方向

判断屏幕方向,可以使用direction属性,有两个值分别是0和1,0是竖屏,1是横屏,也可以使用枚举值DIRECTION_VERTICAL和DIRECTION_HORIZONTAL表示,基本代码如下:

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
    let direction = rManager.getConfigurationSync().direction
    if(direction == resourceManager.Direction.DIRECTION_VERTICAL){
      console.log("===竖屏")
    }else if(direction == resourceManager.Direction.DIRECTION_HORIZONTAL){
      console.log("===横屏")
    }

三、获取设备类型

获取设备类型,可以使用deviceType属性,有七个值可以选择。

基本代码如下:

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
    let deviceType = rManager.getConfigurationSync().deviceType
    if(deviceType == resourceManager.DeviceType.DEVICE_TYPE_PHONE){
      console.log("===手机")
    }else if(deviceType == resourceManager.DeviceType.DEVICE_TYPE_TABLET){
      console.log("===平板")
    }else if(deviceType == resourceManager.DeviceType.DEVICE_TYPE_CAR){
      console.log("===汽车")
    }else if(deviceType == resourceManager.DeviceType.DEVICE_TYPE_PC){
      console.log("===电脑")
    }else if(deviceType == resourceManager.DeviceType.DEVICE_TYPE_TV){
      console.log("===电视")
    }else if(deviceType == resourceManager.DeviceType.DEVICE_TYPE_WEARABLE){
      console.log("===穿戴")
    }else if(deviceType == resourceManager.DeviceType.DEVICE_TYPE_2IN1){
      console.log("===2IN1")
    }

四、获取设备屏幕密度

屏幕密度,通过screenDensity属性来获取,有6个类型可供选择,从小密度到超特大密度都有,基本代码如下:

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
    let screenDensity = rManager.getConfigurationSync().screenDensity
    if(screenDensity == resourceManager.ScreenDensity.SCREEN_SDPI){
      console.log("===小规模的屏幕密度")
    }else if(screenDensity == resourceManager.ScreenDensity.SCREEN_MDPI){
      console.log("===中规模的屏幕密度")
    }else if(screenDensity == resourceManager.ScreenDensity.SCREEN_LDPI){
      console.log("===大规模的屏幕密度")
    }else if(screenDensity == resourceManager.ScreenDensity.SCREEN_XLDPI){
      console.log("===特大规模的屏幕密度")
    }else if(screenDensity == resourceManager.ScreenDensity.SCREEN_XXLDPI){
      console.log("===超大规模的屏幕密度")
    }else if(screenDensity == resourceManager.ScreenDensity.SCREEN_XXXLDPI){
      console.log("===超特大规模的屏幕密度")
    }

五、获取颜色模式

颜色模式,通过colorMode进行获取,有两个值,深色模式和浅色模式,也就是0和1代表,同样的,也可以通过枚举值进行判断,DARK和LIGHT来判断。

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
    let colorMode = rManager.getConfigurationSync().colorMode
    if(colorMode == resourceManager.ColorMode.DARK){
      console.log("===深色模式")
    }else if(colorMode == resourceManager.ColorMode.LIGHT){
      console.log("===浅色模式")
    }

六、获取字符串资源

这个在前言中已经有过案例,可以通过getStringSync方法来获取,支持多种方式,比如只传递Resource,代码如下:

代码语言:typescript
AI代码解释
复制
  let rManager = getContext().resourceManager
  let testString = rManager.getStringSync($r("app.string.test_string"))
  console.log("==="+testString)

当然了,也支持获取指定资源ID对应的字符串,也就是和前言中一致,当然了也支持格式化参数。

格式化参数

定义格式化参数:

代码语言:typescript
AI代码解释
复制
{
      "name": "test_string",
      "value": "一个简单的%d测试数据"
    }

代码调用如下:

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
    let testString = rManager.getStringSync($r("app.string.test_string").id,100)
    console.log("==="+testString)

打印如下:

代码语言:typescript
AI代码解释
复制
===一个简单的100测试数据

格式化字符串资源参数,支持参数类型:%d、%f、%s、%%、%数字$d、%数字$f、%数字$s。

通过定义name获取

上面的获取方式,需要$r()进行协助获取,还有一种比较简单的方式,直接通过定义的name来获取,那就是通过getStringByNameSync方法获取,同样也支持格式化参数。

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
let testString = rManager.getStringByNameSync("test_string")
console.log("==="+testString)

通过getStringValue获取

我们也可以通过getStringValue方法来进行获取定义的资源,有两种方式分别是callback异步回调和Promise异步回调,同样也支持资源和资源id两种形式获取。

callback异步回调

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
    rManager.getStringValue($r("app.string.test_string").id, (err,testString) => {
      console.log("===" + testString)
    })

Promise异步回调

代码语言:typescript
AI代码解释
复制
let testString=await rManager.getStringValue($r("app.string.test_string"))
console.log("===" + testString)

通过getStringByName获取

也是有两种获取方式,callback异步回调和Promise异步回调,同样也支持资源和资源id两种形式获取,简单举例如下。

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
let testString=await rManager.getStringByName("test_string")
console.log("===" + testString)

七、获取字符串数组资源

有四个方法可以获取,分别是getStringArrayValue,getStringArrayByName,getStringArrayValueSync

,getStringArrayValueSync。

getStringArrayValue

getStringArrayValue支持资源和id形式,同样,分别也有两种获取方式callback异步回调和Promise异步回调。

callback异步回调

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
   rManager.getStringArrayValue($r("app.strarray.test"),(err,data)=>{
      console.log("===" + data)
    })

Promise异步回调

代码语言:typescript
AI代码解释
复制
let data= await rManager.getStringArrayValue($r("app.strarray.test"))
console.log("===" + data)

以上的方式,均支持id的形式,这里就不赘述了。

getStringArrayByName

getStringArrayByName支持资源和id形式,同样,分别也有两种获取方式callback异步回调和Promise异步回调。

callback异步回调

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
    rManager.getStringArrayByName("test", (err, data) => {
      console.log("===" + data)
    })

Promise异步回调

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
let data= await rManager.getStringArrayByName("test")
console.log("===" + data)

getStringArrayValueSync和getStringArrayValueSync都是同步的方式,同时支持id和资源的形式,基本使用方式如出一辙,就不过多赘述了。

八、获取number资源

number和字符串类似,无非就是方法名字不一样,提供了有两种获取方式,getNumber和getNumberByName,都是用于获取指定资源ID对应的integer数值或者float数值。

getNumber

支持Resource和资源ID两种方式。

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
let integer_1 = rManager.getNumber($r("app.integer.integer_1"))
console.log("==="+integer_1)

getNumberByName

只支持一种方式,也就是通过定义的name获取。

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
let integer_1 = rManager.getNumberByName("integer_1")
console.log("==="+integer_1)

九、获取boolean资源

用法和number基本一致。

getBoolean

代码语言:typescript
AI代码解释
复制
    let rManager = getContext().resourceManager
    let boolean_1 = rManager.getBoolean($r("app.boolean.boolean_1"))
    console.log("===" + boolean_1)

getBooleanByName

代码语言:typescript
AI代码解释
复制
let rManager = getContext().resourceManager
    let boolean_1 = rManager.getBooleanByName("boolean_1")
    console.log("===" + boolean_1)

十、其他资源获取

只要是定义在resources里资源,我们都可以进行获取,比如颜色,音视频,图片等等,都可以通过resourceManager来获取,比如颜色通过getColor、getColorSync、getColorByName、getColorByNameSync来获取,内容太多了,以后有时间再介绍吧。

相关总结

熟练的使用资源管理,可以极大的提高我们的开发效率,不仅仅在一些组件中使用到,更多的是在一些三方的sdk中,由于定义的类型单一,为了项目的可维护,资源管理的使用也是非常的常见的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
harmony-utils之ResUtil,资源相关工具类
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。 picker_utils 是harmony-utils拆分出来的一个子库,包含PickerUtil、PhotoHelper、ScanUtil。
童长老
2025/06/29
1450
使用 Node.js 的 Async Hooks 模块追踪异步资源
Async Hooks 功能是 Node.js v8.x 版本新增加的一个核心模块,它提供了 API 用来追踪 Node.js 程序中异步资源的声明周期,可在多个异步调用之间共享数据,本文从最基本入门篇开始学习,之后会有在某些场景下具体应用实践篇介绍。
五月君
2021/01/26
1.3K0
HarmonyOS4.0——ArkUI应用说明
ArkUI开发框架是方舟开发框架的简称,它是一套构建 HarmonyOS / OpenHarmony 应用界面的声明式UI开发框架,它使用极简的UI信息语法、丰富的UI组件以及实时界面语言工具,帮助开发者提升应用界面开发效率 30%,开发者只需要使用一套 TS / JS API,就能在多个 HarmonyOS / OpenHarmony 设备上提供既丰富又流畅的用户界面体验。
小帅聊鸿蒙
2024/07/04
4930
HarmonyOS4.0——ArkUI应用说明
前端开发面试如何答题才能让面试官满意
值得注意的是,和⼤多数浏览器不同,Chrome 浏览器的每个标签⻚都分别对应⼀个呈现引擎实例。每个标签⻚都是⼀个独⽴的进程。
loveX001
2022/09/23
1.4K0
HarmonyOS学习路之开发基础知识——资源文件
应用的资源文件(字符串、图片、音频等)统一存放于resources目录下,便于开发者使用和维护。resources目录包括两大类目录,一类为base目录与限定词目录,另一类为rawfile目录 资源目录示例:
爱吃土豆丝的打工人
2021/11/10
9000
HarmonyOS学习路之开发基础知识——资源文件
HarmonyOS 开发实践 —— 基于原生能力的各类通知管理
除了基础类型通知外还包含长文本类型和多行文本类型,长文本和多行文本类型通知支持展开,通知对比如下:
小帅聊鸿蒙
2024/12/18
1900
HarmonyOS 开发实践 —— 基于原生能力的各类通知管理
三文带你轻松上手鸿蒙的AI语音02-声音文件转文本
AVRecorder录制出来的声音封装格式只能是aac,这个文件格式我们的AI语音引擎不支持,AI语音引擎只支持pcm格式,而 AudioCapturer录制的声音封装格式则是pcm。因此我们选择使用 AudioCapturer 来录制声音
万少
2025/02/09
1730
三文带你轻松上手鸿蒙的AI语音02-声音文件转文本
Egret资源管理解决方案
转载于:https://www.cnblogs.com/gamedaybyday/p/6079694.html
携秋水揽星河
2021/09/03
7500
HarmonyOS 开发实践 —— 基于JSVM创建引擎执行JS代码并销毁
通过JSVM,可以在应用运行期间直接执行一段动态加载的JS代码。也可以选择将一些对性能、底层系统调用有较高要求的核心功能用C/C++实现并将C++方法注册到JS侧,在JS代码中直接调用,提高应用的执行效率。
小帅聊鸿蒙
2024/11/29
3140
HarmonyOS 开发实践 —— 基于JSVM创建引擎执行JS代码并销毁
前端面试题整理
媒体查询由⼀个可选的媒体类型和零个或多个使⽤媒体功能的限制了样式表范围的表达式组成,例如宽度、⾼度和颜⾊。媒体查询,添加⾃CSS3,允许内容的呈现针对⼀个特定范围的输出设备⽽进⾏裁剪,⽽不必改变内容本身,适合web⽹⻚应对不同型号的设备⽽做出对应的响应适配。
loveX001
2022/09/15
2810
06_Node.js服务器开发
Node.js开发属于服务器开发,那么作为一名前端工程师为什么需要学习服务器开发呢?
张哥编程
2024/12/13
2010
06_Node.js服务器开发
鸿蒙开发:一文探究Navigation路由组件
如果你还在使用router做为页面跳转,建议切换Navigation组件作为应用路由框架,不为别的,因为官方目前针对router已不在推荐。
程序员一鸣
2024/12/23
3260
鸿蒙开发:一文探究Navigation路由组件
【HarmonyOS之旅】基于ArkTS开发(一) -> Ability开发二
基于Data模板的Ability,有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。
枫叶丹
2025/01/09
1590
【HarmonyOS 5】鸿蒙中的UIAbility详解(二)
今天我们继续深入讲解UIAbility,根据下图可知,在鸿蒙中UIAbility继承于Ability,开发者无法直接继承Ability。只能使用其两个子类:UIAbility和ExtensionAbility。
GeorgeGcs
2025/06/01
1110
基于前端的计时器工具:实现与优化
在前端开发中,计时器是一个常见的工具,广泛应用于倒计时、定时任务、间隔刷新等场景。本文将介绍如何在前端实现一个通用的计时器工具,并通过实例深入探讨其优化和应用。
一键难忘
2024/10/12
8691
HarmonyOS 开发实践——基于ImageKit对图片进行处理
format为图像的编码格式;quality为图像质量,范围从0-100,100为最佳质量。
小帅聊鸿蒙
2024/11/07
3380
JavaScript异步编程设计快速响应的网络应用
因为setTimeout回调在while循环结束运行之前不可能被触发! 调用setTimeout时,会有一个延时事件排入队列。然后继续执行下一行代码,直到再没有任何代码(处理器空闲时),才执行setTimeout回调函数(前提已到达其延迟时间)。 JavaScript代码永远不会被中断,这是因为代码在运行期间内只需要安排队事件即可,而这些事件在代码运行结束之前不会被触发! 请参考:JavaScript事件驱动机制&定时器机制
奋飛
2019/08/15
2.2K0
34.[HarmonyOS NEXT Row案例二] 打造响应式图文导航项:设备适配与弹性空间的完美结合
HarmonyOS NEXT应用开发中,一个常见的需求是根据不同设备类型(如手机、平板)提供不同的用户界面体验。本教程将详细讲解如何使用Row组件创建响应式图文导航项,实现在不同设备上的智能适配,提供最佳的用户体验。
全栈若城
2025/06/02
950
34.[HarmonyOS NEXT Row案例二] 打造响应式图文导航项:设备适配与弹性空间的完美结合
HarmonyOS NEXT实战:沙箱工具
##HarmonyOS Next实战##HarmonyOS SDK应用服务##教育##
中雨
2025/06/25
670
HarmonyOS 开发实践 —— 基于rcp的网络请求能力
rcp模块提供HTTP数据请求功能,请求性能如接口的易用性、性能、功耗方面,对比Network Kit HTTP网络API,rcp采用面向对象和场景的设计,API使用更简单、更灵活,满足不同场景的使用需求,具备更好的扩展性和更优的性能。支持如场景化网络API、网络代理、自定义DNS解析、自定义证书校验、服务器身份校验等特性。
小帅聊鸿蒙
2024/11/22
3970
HarmonyOS 开发实践 —— 基于rcp的网络请求能力
推荐阅读
相关推荐
harmony-utils之ResUtil,资源相关工具类
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档