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

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

前言


本文基于Api13


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


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


{
      "name": "test_string",
      "value": "一个简单的测试数据"
    }


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


Text($r("app.string.test_string"))


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


$r()源码如下:


/**
 * 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组件源码如下:


/**
     * 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来获取。


Text(getContext().resourceManager.getStringSync($r("app.string.test_string").id))


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


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


一、使用方式


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


let rManager = getContext().resourceManager


二、获取设备屏幕方向


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


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属性,有七个值可以选择。



基本代码如下:


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个类型可供选择,从小密度到超特大密度都有,基本代码如下:


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来判断。


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,代码如下:


let rManager = getContext().resourceManager
  let testString = rManager.getStringSync($r("app.string.test_string"))
  console.log("==="+testString)


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


格式化参数


定义格式化参数:


{
      "name": "test_string",
      "value": "一个简单的%d测试数据"
    }


代码调用如下:


let rManager = getContext().resourceManager
    let testString = rManager.getStringSync($r("app.string.test_string").id,100)
    console.log("==="+testString)


打印如下:


===一个简单的100测试数据


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

通过定义name获取


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


let rManager = getContext().resourceManager
let testString = rManager.getStringByNameSync("test_string")
console.log("==="+testString)

通过getStringValue获取

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

callback异步回调

let rManager = getContext().resourceManager
    rManager.getStringValue($r("app.string.test_string").id, (err,testString) => {
      console.log("===" + testString)
    })


Promise异步回调

let testString=await rManager.getStringValue($r("app.string.test_string"))
console.log("===" + testString)


通过getStringByName获取


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


let rManager = getContext().resourceManager
let testString=await rManager.getStringByName("test_string")
console.log("===" + testString)


七、获取字符串数组资源



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

,getStringArrayValueSync。


getStringArrayValue


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

callback异步回调

let rManager = getContext().resourceManager
   rManager.getStringArrayValue($r("app.strarray.test"),(err,data)=>{
      console.log("===" + data)
    })


Promise异步回调

let data= await rManager.getStringArrayValue($r("app.strarray.test"))
console.log("===" + data)


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

getStringArrayByName


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

callback异步回调

let rManager = getContext().resourceManager
    rManager.getStringArrayByName("test", (err, data) => {
      console.log("===" + data)
    })


Promise异步回调

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两种方式。


let rManager = getContext().resourceManager
let integer_1 = rManager.getNumber($r("app.integer.integer_1"))
console.log("==="+integer_1)


getNumberByName

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


let rManager = getContext().resourceManager
let integer_1 = rManager.getNumberByName("integer_1")
console.log("==="+integer_1)


九、获取boolean资源


用法和number基本一致。


getBoolean


let rManager = getContext().resourceManager
    let boolean_1 = rManager.getBoolean($r("app.boolean.boolean_1"))
    console.log("===" + boolean_1)


getBooleanByName


let rManager = getContext().resourceManager
    let boolean_1 = rManager.getBooleanByName("boolean_1")
    console.log("===" + boolean_1)


十、其他资源获取


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


相关总结


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

相关文章
|
20天前
|
UED 容器
5.HarmonyOS Next开发宝典:掌握Flex布局的艺术
Flex布局(弹性布局)是HarmonyOS Next中最强大的布局方式之一,它提供了一种更加高效、灵活的方式来对容器中的子元素进行排列、对齐和分配空间。无论是简单的居中显示,还是复杂的自适应界面,Flex布局都能轻松应对。
47 0
|
20天前
|
JSON IDE Java
鸿蒙开发:json转对象插件回来了
首先,我重新编译了插件,进行了上传,大家可以下载最新的安装包进行体验了,还是和以前一样,提供了在线版和IDE插件版,两个选择,最新的版本,除了升级了版本,兼容了最新的DevEco Studio ,还做了一层优化,就是针对嵌套对象和属性的生成,使用方式呢,一年前的文章中有过详细的概述,这里呢也简单介绍一下。
鸿蒙开发:json转对象插件回来了
|
20天前
|
索引
鸿蒙开发:自定义切换动画实现Swiper层叠滑动效果
customContentTransition不仅仅可以实现平移上的改变,很多的效果,我们都可以实现,比如放大缩小,旋转等等。
鸿蒙开发:自定义切换动画实现Swiper层叠滑动效果
|
16天前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
43 1
|
16天前
|
JavaScript 前端开发 IDE
鸿蒙开发:了解布局分析ArkUI Inspector
ArkUI Inspector,知名其意,就是UI检查,它可以让开发者在DevEco Studio中快速的查看一个应用在模拟器或者真机上的UI显示效果,并且可以通过查看多次操作后的界面状态,来快速的分析定位UI界面存在的问题。
鸿蒙开发:了解布局分析ArkUI Inspector
|
16天前
|
数据挖掘 测试技术 开发工具
鸿蒙开发:hvigorw,编译构建,实现命令打包
以上呢,就是hvigorw几个常见的命令,主要用于构建不同类型的包,也是接下来流水线打包,几个比较常用的命令,所以拿来重点概述了,当然了hvigorw还有一些常见的命令,大家直接看官网介绍即可,不在多赘述。
鸿蒙开发:hvigorw,编译构建,实现命令打包
|
16天前
|
缓存 开发工具 开发者
鸿蒙开发:了解构建工具hvigorw
hvigorw作为Hvigor的wrapper包装工具,它的主要作用是,支持自动安装Hvigor构建工具和相关插件依赖,以及执行Hvigor构建命令
鸿蒙开发:了解构建工具hvigorw
|
16天前
|
安全 前端开发 开发工具
鸿蒙开发:应用内如何做更新
使用系统的,直接调用检查和显示更新弹窗即可,可以说就两个方法,我们就实现了应用更新的功能,可以说是非常的简单,如果系统的弹窗无法满足您的需求,您可以自定义弹窗,然后实现跳转应用详情页面即可。
鸿蒙开发:应用内如何做更新
|
20天前
|
JavaScript 前端开发 开发者
09.HarmonyOS Next数据驱动UI开发:ForEach与动态渲染完全指南(上)
在现代前端开发中,数据驱动UI已成为主流开发范式。HarmonyOS Next的ArkTS语言和声明式UI框架完美支持这一理念,使开发者能够以更高效、更直观的方式构建复杂应用。
48 1
|
16天前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
50 0

热门文章

最新文章