#跟着坚果学鸿蒙#资源分类与访问<七>
资源匹配
应用使用某资源时,系统会根据当前设备状态优先从相匹配的限定词目录中寻找该资源。只有当resources目录中没有与设备状态匹配的限定词目录,或者在限定词目录中找不到该资源时,才会去base目录中查找。rawfile和resfile是原始文件目录,不会根据设备状态去匹配资源。
限定词目录与设备状态的匹配规则
-
在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为:移动国家码和移动网络码 > 区域(可选组合:语言、语言_文字、语言_国家或地区、语言_文字_国家或地区)> 横竖屏 > 设备类型 > 颜色模式 > 屏幕密度。
-
如果限定词目录中包含移动国家码和移动网络码、语言、文字、横竖屏、设备类型、颜色模式限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配。例如,限定词目录zh_CN-car-ldpi不能参与en_US设备的资源匹配。
-
如果存在多个屏幕密度限定词目录,则优先向上匹配最接近的屏幕密度限定词目录,否则向下匹配最为接近的屏幕密度限定词目录。例如,假设存在限定词目录xldpi和xxldpi,设备屏幕密度为xxldpi,则会匹配xxldpi限定词目录。
获取指定配置的资源
基本概念
开发者可以在工程的resources目录下添加限定词目录,满足多语言、深浅色模式等不同类型的系统设置。然而,在获取资源时,由于限定词目录匹配规则,只能筛选出最匹配的资源,无法获取其它目录资源。
应用如果有获取指定配置的资源的诉求,可以通过以下方法进行获取。
接口说明
接口名 | 描述 |
---|---|
getOverrideResourceManager(configuration?: Configuration) : ResourceManager | 获取可以加载指定配置的资源的资源管理对象,使用同步方式返回。 |
getOverrideConfiguration() : Configuration | 获取指定的配置,使用同步方式返回。 |
updateOverrideConfiguration(configuration: Configuration) : void | 更新指定的配置。 |
以获取非当前系统语言的资源为例,说明如何获取指定配置的资源。假设工程中定义了中文、英文、德文的同名资源如下:
- entry/src/main/resources/zh_CN/element/string.json
{
"string": [
{
"name": "greetings",
"value": "你好,世界"
}
]
}
- entry/src/main/resources/en_US/element/string.json
{
"string": [
{
"name": "greetings",
"value": "Hello, world"
}
]
}
- entry/src/main/resources/de_DE/element/string.json
{
"string": [
{
"name": "greetings",
"value": "Hallo, Welt"
}
]
}
在Index.ets中,分别获取三种语言的资源并显示在文本框中,运行设备当前系统语言为中文,entry/src/main/ets/pages/Index.ets的代码如下:
@Entry
@Component
struct Index {
@State englishString: string = ""
@State germanString: string = ""
getString(): string {
let resMgr = getContext().resourceManager
let resId = $r('app.string.greetings').id
//获取符合当前系统语言地区、颜色模式、分辨率等配置的资源
let currentLanguageString = resMgr.getStringSync(resId)
//获取符合当前系统颜色模式、分辨率等配置的英文资源
let overrideConfig = resMgr.getOverrideConfiguration()
overrideConfig.locale = "en_US" //指定资源的语言为英语,地区为美国
let overrideResMgr = resMgr.getOverrideResourceManager(overrideConfig)
this.englishString = overrideResMgr.getStringSync(resId)
//获取符合当前系统颜色模式、分辨率等配置的德文资源
overrideConfig.locale = "de_DE" //指定资源的语言为德语,地区为德国
overrideResMgr.updateOverrideConfiguration(overrideConfig) //等效于resMgr.updateOverrideConfiguration(overrideConfig)
this.germanString = overrideResMgr.getStringSync(resId)
return currentLanguageString
}
build() {
Row() {
Column() {
Text(this.getString())
.fontSize(50)
.fontWeight(FontWeight.Bold)
Text(this.englishString)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Text(this.germanString)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.height('100%')
}
}
更多推荐
所有评论(0)