• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Resource Categories and Access
2
3During application development, you may need to use different resources, such as colors, fonts, spacing, and images, based on the device or configuration. Depending on the resource type, you can achieve this using the following methods:
4
5- Application resources: Configure device- or configuration-specific resources in the resource files.
6
7- System resources: Use the preset resource definitions.
8
9## Resource Categories
10
11### resources Directory
12
13Resource files used during application development must be stored in specified directories for management. The **resources** directory consists of three types of subdirectories: the **base** subdirectory, qualifiers subdirectories, and the **rawfile** subdirectory. The common resource files used across projects in the stage model are stored in the **resources** directory under **AppScope**.
14
15The **base** subdirectory is provided by default, and the qualifiers subdirectories are created on your own. When your application needs to use a resource, the system preferentially searches the qualifiers subdirectories that match the current device state. The system searches the **base** subdirectory for the target resource only when the **resources** directory does not contain any qualifiers subdirectories that match the current device state or the target resource is not found in the qualifiers subdirectories. The **rawfile** directory is not searched for resources.
16
17Example of the **resources** directory:
18
19```
20resources
21|---base  // Default directory
22|   |---element
23|   |   |---string.json
24|   |---media
25|   |   |---icon.png
26|---en_GB-vertical-car-mdpi // Example of a qualifiers subdirectory, which needs to be created on your own
27|   |---element
28|   |   |---string.json
29|   |---media
30|   |   |---icon.png
31|---rawfile
32```
33
34**Table 1** Classification of the resources directory
35
36| Category  | base Subdirectory                          | Qualifiers Subdirectory                                   | rawfile Subdirectory                               |
37| ---- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
38| Structure| The **base** subdirectory is a default directory. If no qualifiers subdirectories in the **resources** directory of the application match the device status, the resource file in the **base** subdirectory will be automatically referenced.<br>Resource group subdirectories are located at the second level of subdirectories to store basic elements such as strings, colors, and boolean values, as well as resource files such as media, animations, and layouts. For details, see [Resource Group Subdirectories](#resource-group-subdirectories).| You need to create qualifiers subdirectories on your own. Each directory name consists of one or more qualifiers that represent the application scenarios or device characteristics. For details, see [Qualifiers Subdirectories](#qualifiers-subdirectories).<br>Resource group subdirectories are located at the second level of subdirectories to store basic elements such as strings, colors, and boolean values, as well as resource files such as media, animations, and layouts. For details, see [Resource Group Subdirectories](#resource-group-subdirectories).| You can create multiple levels of subdirectories with custom directory names. They can be used to store various resource files.<br>However, resource files in the **rawfile** subdirectory will not be matched based on the device status.|
39| Compilation| Resource files in the subdirectory are compiled into binary files, and each resource file is assigned an ID.           | Resource files in the subdirectory are compiled into binary files, and each resource file is assigned an ID.           | Resource files in the subdirectory are directly packed into the application without being compiled, and no IDs will be assigned to the resource files.   |
40| Reference| Resource files in the subdirectory are referenced based on the resource type and resource name.           | Resource files in the subdirectory are referenced based on the resource type and resource name.           | Resource files in the subdirectory are referenced based on the file path and file name.                        |
41
42
43### Qualifiers Subdirectories
44
45The name of a qualifiers subdirectory consists of one or more qualifiers that represent the application scenarios or device characteristics, covering the mobile country code (MCC), mobile network code (MNC), language, script, country or region, screen orientation, device type, night mode, and screen density. The qualifiers are separated using underscores (\_) or hyphens (\-). Before creating a qualifiers subdirectory, familiarize yourself with the directory naming conventions and the rules for matching qualifiers subdirectories and the device status.
46
47**Naming Conventions for Qualifiers Subdirectories**
48
49- Qualifiers are ordered in the following sequence: **\_MCC_MNC-language_script_country/region-orientation-device-color mode-density_**. You can select one or multiple qualifiers to name your subdirectory based on your application scenarios and device characteristics.
50
51- Separation between qualifiers: The language, script, and country/region qualifiers are separated using underscores (\_); the MNC and MCC qualifiers are also separated using underscores (\_); other qualifiers are separated using hyphens (\-). For example, **zh_Hant_CN** and **zh_CN-car-ldpi**.
52
53- Value range of qualifiers: The value of each qualifier must meet the requirements specified in the following table. Otherwise, the resource files in the resources directory cannot be matched.
54
55**Table 2** Requirements for qualifier values
56
57| Qualifier Type      | Description and Value Range                                 |
58| ----------- | ---------------------------------------- |
59| MCC&MNC| Indicates the MCC and MNC, which are obtained from the network where the device is registered. The MCC can be either followed by the MNC with an underscore (\_) in between or be used independently. For example, **mcc460** indicates China, and **mcc460\_mnc00** indicates China\_China Mobile.<br>For details about the value range, refer to **ITU-T E.212** (the international identification plan for public networks and subscriptions).|
60| Language         | Indicates the language used by the device. The value consists of two or three lowercase letters. For example, **zh** indicates Chinese, **en** indicates English, and **mai** indicates Maithili.<br>For details about the value range, refer to **ISO 639** (codes for the representation of names of languages).|
61| Text         | Indicates the script type used by the device. The value starts with one uppercase letter followed by three lowercase letters. For example, **Hans** indicates simplified Chinese, and **Hant** indicates traditional Chinese.<br>For details about the value range, refer to **ISO 15924** (codes for the representation of names of scripts).|
62| Country/Region      | Indicates the country or region where the user is located. The value consists of two or three uppercase letters or three digits. For example, **CN** indicates China, and **GB** indicates the United Kingdom.<br>For details about the value range, refer to **ISO 3166-1** (codes for the representation of names of countries and their subdivisions).|
63| Screen orientation        | Indicates the screen orientation of the device. The value can be:<br>- **vertical**: portrait orientation<br>- **horizontal**: landscape orientation|
64| Device type       | Indicates the device type. The value can be:<br>- **car**: head unit<br>- **tv**: smart TV<br>- **wearable**: smart wearable|
65| Color mode       | Indicates the color mode of the device. The value can be:<br>- **dark**: dark mode<br>- **light**: light mode|
66| Screen density       | Indicates the screen density of the device, in dpi. The value can be:<br>- **sdpi**: screen density with small-scale dots per inch (SDPI). This value is applicable for devices with a DPI range of (0, 120].<br>- **mdpi**: medium-scale screen density (Medium-scale Dots Per Inch), applicable to DPI whose value is (120,  160] device.<br>- **ldpi**: screen density with large-scale dots per inch (LDPI). This value is applicable for devices with a DPI range of (160, 240].<br>- **xldpi**: screen density with extra-large-scale dots per inch (XLDPI). This value is applicable for devices with a DPI range of (240, 320].<br>- **xxldpi**: screen density with extra-extra-large-scale dots per inch (XXLDPI). This value is applicable for devices with a DPI range of (320, 480].<br>- **xxxldpi**: screen density with extra-extra-extra-large-scale dots per inch (XXXLDPI). This value is applicable for devices with a DPI range of (480, 640].|
67
68**Rules for Matching Qualifiers Subdirectories and Device Resources**
69
70- Qualifiers are matched with the device resources in the following priorities: MCC&MNC > locale (options: language, language_script, language_country/region, and language_script_country/region) > screen orientation > device type > color mode > screen density.
71
72- If the qualifiers subdirectories contain the **MCC, MNC, language, script, screen orientation, device type, and color mode** qualifiers, their values must be consistent with the current device status so that the subdirectories can be used for matching the device resources. For example, the qualifiers subdirectory **zh_CN-car-ldpi** cannot be used for matching the resource files labeled **en_US**.
73
74
75### Resource Group Subdirectories
76
77You can create resource group subdirectories (including element, media, and profile) in the **base** and qualifiers subdirectories to store resource files of specific types.
78
79
80**Table 3** Resource group subdirectories
81
82| Resource Group Subdirectory  | Description                                    | Resource File                                    |
83| ------- | ---------------------------------------- | ---------------------------------------- |
84| element | Indicates element resources. Each type of data is represented by a JSON file. (Only files are supported in this directory.) The options are as follows:<br>- **boolean**: boolean data<br>- **color**: color data<br>- **float**: floating-point data<br>- **intarray**: array of integers<br>- **integer**: integer data<br>- **pattern**: pattern data<br>- **plural**: plural form data<br>- **strarray**: array of strings<br>- **string**: string data| It is recommended that files in the **element** subdirectory be named the same as the following files, each of which can contain only data of the same type:<br>- boolean.json<br>- color.json<br>- float.json<br>- intarray.json<br>- integer.json<br>- pattern.json<br>- plural.json<br>- strarray.json<br>- string.json |
85| media   | Indicates media resources, including non-text files such as images, audios, and videos. (Only files are supported in this directory.)             | The file name can be customized, for example, **icon.png**.                    |
86| profile  | Indicates a custom configuration file. You can obtain the file content by using the [getProfileByAbility](../reference/apis/js-apis-bundleManager.md#bundlemanagergetprofilebyability) API. (Only files are supported in this directory.)      | The file name can be customized, for example, **test_profile.json**.          |
87| rawfile | Indicates other types of files, which are stored in their raw formats after the application is built as an HAP file. They will not be integrated into the **resources.index** file.| The file name can be customized.                                |
88
89**Media Resource Types**
90
91**Table 4** Image resource types
92
93| Format  | File Name Extension|
94| ---- | ----- |
95| JPEG | .jpg  |
96| PNG  | .png  |
97| GIF  | .gif  |
98| SVG  | .svg  |
99| WEBP | .webp |
100| BMP  | .bmp  |
101
102**Table 5** Audio and video resource types
103
104| Format                                  | File Name Extension        |
105| ------------------------------------ | --------------- |
106| H.263                                | .3gp <br>.mp4   |
107| H.264 AVC <br> Baseline Profile (BP) | .3gp <br>.mp4   |
108| MPEG-4 SP                            | .3gp            |
109| VP8                                  | .webm <br> .mkv |
110
111**Resource File Examples**
112
113The content of the **color.json** file is as follows:
114
115
116```json
117{
118    "color": [
119        {
120            "name": "color_hello",
121            "value": "#ffff0000"
122        },
123        {
124            "name": "color_world",
125            "value": "#ff0000ff"
126        }
127    ]
128}
129```
130
131The content of the **float.json** file is as follows:
132
133
134```json
135{
136    "float":[
137        {
138            "name":"font_hello",
139            "value":"28.0fp"
140        },
141	{
142            "name":"font_world",
143            "value":"20.0fp"
144        }
145    ]
146}
147```
148
149The content of the **string.json** file is as follows:
150
151
152```json
153{
154    "string":[
155        {
156            "name":"string_hello",
157            "value":"Hello"
158        },
159	{
160            "name":"string_world",
161            "value":"World"
162        },
163	{
164            "name":"message_arrive",
165            "value":"We will arrive at %s."
166        }
167    ]
168}
169```
170
171The content of the **plural.json** file is as follows:
172
173
174```json
175{
176    "plural":[
177        {
178            "name":"eat_apple",
179            "value":[
180                {
181                    "quantity":"one",
182                    "value":"%d apple"
183                },
184                {
185                    "quantity":"other",
186                    "value":"%d apples"
187                }
188            ]
189        }
190    ]
191}
192```
193
194## Resource Access
195
196### Application Resources
197
198**Creating a Resource File**
199
200You can create a subdirectory and its files under the **resources** directory based on the preceding descriptions of the qualifiers subdirectories and resource group subdirectories.
201
202DevEco Studio provides a wizard for you to create resource directories and resource files.
203
204- Creating a Resource Directory and Resource File
205
206  Right-click the **resources** directory and choose **New > Resource File**. If no qualifier is selected, the file is created in a resource type subdirectory under **base**. If one or more qualifiers are selected, the system automatically generates a subdirectory and creates the file in this subdirectory. To select a qualifier, highlight it under **Available qualifiers** and click the right arrow. To deselect a qualifier, highlight it under **Selected qualifiers** and click the left arrow. In **File name**, enter the name of the resource file to create. In **Resource type**, select the type of the resource group, which is **element** by default. In **Root Element**, select a resource type. The created subdirectory is automatically named in the format of *Qualifiers.Resource group type*. For example, if you create a subdirectory by setting **Color Mode** to **Dark** and **Resource type** to **Element**, the system automatically generates a subdirectory named **dark.element**.
207
208  ![create-resource-file-1](figures/create-resource-file-1.png)
209
210- Creating a Resource Directory
211
212  Right-click the **resources** directory and choose **New > Resource Directory** to create a subdirectory only. By default, the **base** subdirectory is created. You can create qualifiers subdirectories as required, by specifying the qualifier and resource group type.
213
214  ![create-resource-file-2](figures/create-resource-file-2.png)
215
216- Creating a Resource File
217
218  Right-click a subdirectory under **resources** and choose **New > *XXX* Resource File**. This operation creates a resource file under this subdirectory. For example, you can create an element resource file in the **element** subdirectory.
219
220  ![create-resource-file-3](figures/create-resource-file-3.png)
221
222**Accessing Application Resources**
223
224To reference an application resource in a project, use the **"$r('app.type.name')"** format. **app** indicates the resource defined in the **resources** directory of the application. **type** indicates the resource type (or the location where the resource is stored). The value can be **color**, **float**, **string**, **plural**, or **media**. **name** indicates the resource name, which you set when defining the resource.
225
226When referencing resources in the **rawfile** subdirectory, use the **"$rawfile('filename')"** format. Wherein **filename** indicates the relative path of a file in the **rawfile** subdirectory, which must contain the file name extension and cannot start with a slash (/).
227
228> **NOTE**
229>
230> Resource descriptors accept only strings, such as **'app.type.name'**, and cannot be combined.
231>
232> The return value of **$r** is a **Resource** object. You can obtain the corresponding string by using the [getStringValue](../reference/apis/js-apis-resource-manager.md#getstringvalue9) API.
233
234In the **.ets** file, you can use the resources defined in the **resources** directory. The following is a resource usage example based on the resource file examples in [Resource Group Sub-directories](#resource-group-subdirectories):
235
236```ts
237Text($r('app.string.string_hello'))
238  .fontColor($r('app.color.color_hello'))
239  .fontSize($r('app.float.font_hello'))
240
241Text($r('app.string.string_world'))
242  .fontColor($r('app.color.color_world'))
243  .fontSize($r('app.float.font_world'))
244
245// Reference string resources. The second parameter of $r is used to replace %s, and value is "We will arrive at five'o clock".
246Text($r('app.string.message_arrive', "five'o clock"))
247  .fontColor($r('app.color.color_hello'))
248  .fontSize($r('app.float.font_hello'))
249
250// Reference plural resources. The first parameter indicates the plural resource, the second parameter indicates the number of plural resources, and the third parameter indicates the substitute of %d.
251// The value is "5 apple" in singular form and "5 apples" in plural form.
252Text($r('app.plural.eat_apple', 5, 5))
253  .fontColor($r('app.color.color_world'))
254  .fontSize($r('app.float.font_world'))
255
256Image($r('app.media.my_background_image'))  // Reference media resources.
257
258Image($rawfile('test.png'))                 // Reference an image in the rawfile directory.
259
260Image($rawfile('newDir/newTest.png'))       // Reference an image in the rawfile directory.
261```
262
263### System Resources
264
265System resources include colors, rounded corners, fonts, spacing, character strings, and images. By using system resources, you can develop different applications with the same visual style.
266
267To reference a system resource, use the **"$r('sys.type.resource_id')"** format. Wherein: **sys** indicates a system resource; **type** indicates the resource type, which can be **color**, **float**, **string**, or **media**; **resource_id** indicates the resource ID.
268
269> **NOTE**
270>
271> - Use of system resources is supported in the declarative development paradigm, but not in the web-like development paradigm.
272>
273> - For details about the implementation of preconfigured resources, visit the [OpenHarmony/resources repository](https://gitee.com/openharmony/resources/tree/master/systemres/main/resources). The directory structure there is similar to that of the **resources** directory in the project. Resource qualifiers are used to match resources with different devices and device states.
274
275```ts
276Text('Hello')
277  .fontColor($r('sys.color.ohos_id_color_emphasize'))
278  .fontSize($r('sys.float.ohos_id_text_size_headline1'))
279  .fontFamily($r('sys.string.ohos_id_text_font_family_medium'))
280  .backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))
281
282Image($r('sys.media.ohos_app_icon'))
283  .border({
284    color: $r('sys.color.ohos_id_color_palette_aux1'),
285    radius: $r('sys.float.ohos_id_corner_radius_button'), width: 2
286  })
287  .margin({
288    top: $r('sys.float.ohos_id_elements_margin_horizontal_m'),
289    bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l')
290  })
291  .height(200)
292  .width(300)
293```
294