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

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

相关文章
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
609 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
532 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
904 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
263 0
|
5月前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
247 1
|
5月前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
582 1
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
5月前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
274 1
|
5月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
463 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
5月前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段三
本文介绍了UI开发中的样式复用与组件构建技术,涵盖@Extend、@Styles和@Builder的使用方法,并通过Swiper轮播、Scroll滚动、Tabs导航等常用组件实现典型界面效果,结合生肖抽卡、小米轮播、回顶按钮等案例,展示实际应用技巧。
168 1
|
5月前
|
传感器 监控 安全
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
V哥分享HarmonyOS NEXT 5.0星闪开发实战,涵盖智能车钥匙无感解锁与工业传感器监控。低延迟、高可靠,代码完整,速来学习!
780 0