Android Studio 添加應(yīng)用資源
前一小節(jié)我們介紹了如何使用 Android Studio 布局編輯器,本小結(jié)我們學(xué)習(xí) Android 的應(yīng)用資源類(lèi)型、備用資源限定和資源合并相關(guān)的知識(shí)。
1. 應(yīng)用資源的類(lèi)型
應(yīng)用資源是指代碼使用的附加文件和靜態(tài)內(nèi)容,例如位圖、布局定義、界面字符串、動(dòng)畫(huà)等。應(yīng)用資源分很多種:
-
動(dòng)畫(huà)資源:定義預(yù)先確定的動(dòng)畫(huà),補(bǔ)間動(dòng)畫(huà)保存在 res/anim/ 中,幀動(dòng)畫(huà)保存在 res/drawable/ 中;
-
顏色狀態(tài)列表資源:定義根據(jù) View 狀態(tài)而變化的顏色資源,保存在 res/color/ 中;
-
可繪制資源:使用位圖或 XML 定義各種圖形,保存在 res/drawable/ 中;
-
布局資源:定義應(yīng)用界面的布局,保存在 res/layout/ 中;
-
菜單資源:定義應(yīng)用菜單的內(nèi)容,保存在 res/menu/ 中;
-
字符串資源:定義字符串、字符串?dāng)?shù)組,保存在 res/values/ 中;
-
樣式資源:定義界面元素的外觀和格式,保存在 res/values/ 中;
-
字體資源:在 XML 中定義字體系列并包含自定義字體,保存在 res/font/ 中。
我們應(yīng)將各類(lèi)資源放入項(xiàng)目 res/ 目錄的特定子目錄中。例如,以下是一個(gè)簡(jiǎn)單項(xiàng)目的文件層次結(jié)構(gòu):
FirstApp/
src/
MainActivity.java
res/
drawable/
graphic.png
layout/
main.xml
info.xml
mipmap/
icon.png
values/
strings.xml
Tips:res/ 目錄包含所有資源:一個(gè)圖像資源、兩個(gè)布局資源、啟動(dòng)器圖標(biāo)資源以及一個(gè)字符串資源文件。
資源目錄名稱(chēng)非常重要,項(xiàng)目 res/ 目錄中支持的資源目錄見(jiàn)下表:
目錄 | 資源類(lèi)型 |
---|---|
animator/ | 用于定義屬性動(dòng)畫(huà)的 XML 文件。 |
anim/ | 用于定義補(bǔ)間動(dòng)畫(huà)的 XML 文件。 |
color/ | 用于定義顏色狀態(tài)列表的 XML 文件。 |
drawable/ | 位圖文件或可繪制對(duì)象資源子類(lèi)型的 XML 文件 |
mipmap/ | 適用于不同啟動(dòng)器圖標(biāo)密度的可繪制對(duì)象文件。 |
layout/ | 用于定義用戶(hù)界面布局的 XML 文件。 |
menu/ | 用于定義應(yīng)用菜單(如選項(xiàng)菜單、上下文菜單或子菜單)的 XML 文件。 |
raw/ | 需以原始形式保存的任意文件。 |
values/ | 包含字符串、整型數(shù)和顏色等簡(jiǎn)單值的 XML 文件。 |
xml/ | 可在運(yùn)行時(shí)讀取的任意 XML 配置文件。 |
font/ | 帶有擴(kuò)展名的字體文件或包含 元素的 XML 文件。 |
上表所列的目錄中,保存的資源為“默認(rèn)”資源,即這些資源定義應(yīng)用的默認(rèn)設(shè)計(jì)和內(nèi)容,除默認(rèn)資源以外,我們還需提供備用資源。
2. 應(yīng)用備用資源
不同類(lèi)型的 Android 設(shè)備可能需要不同類(lèi)型的資源。例如,如果設(shè)備屏幕比標(biāo)準(zhǔn)屏幕大,則應(yīng)提供不同的布局資源,從而充分利用額外的屏幕空間;如果設(shè)備的語(yǔ)言設(shè)置不同,則應(yīng)提供不同的字符串資源,以便將界面中的文本轉(zhuǎn)換為其他語(yǔ)言。在運(yùn)行時(shí),Android 會(huì)檢測(cè)當(dāng)前設(shè)備配置并為應(yīng)用加載合適的資源。
我們?nèi)绾螢橐唤M資源指定配置特定的備用資源呢?分兩步:
- 在 res/ 中創(chuàng)建以 < resources_name >-< config_qualifier > 形式命名的新目錄;
- < resources_name > 是相應(yīng)默認(rèn)資源的目錄名稱(chēng);
- < config_qualifier > 是指定要使用這些資源的各個(gè)配置限定符的名稱(chēng)。
- 將相應(yīng)的備用資源保存在此新目錄下,這些資源文件必須與默認(rèn)資源文件完全同名。
例如,以下是一些默認(rèn)資源和屏幕像素密度備用資源:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
hdpi 限定符表示該目錄中的資源適用于屏幕密度較高的設(shè)備。其中,每個(gè)可繪制對(duì)象目錄中的圖像均已針對(duì)特定的屏幕密度調(diào)整了大小,但文件名完全相同。如此一來(lái),用于引用 icon.png 或 background.png 圖像的資源 ID 始終相同,但 Android 會(huì)通過(guò)將設(shè)備配置信息與資源目錄名稱(chēng)中的限定符進(jìn)行比較,選擇最符合當(dāng)前設(shè)備的各個(gè)資源版本。
Android 支持若干配置限定符,我們可以通過(guò)使用短劃線分隔每個(gè)限定符,從而向一個(gè)目錄名稱(chēng)添加多個(gè)限定符。下表按優(yōu)先級(jí)順序列出了有效的配置限定符;如果對(duì)資源目錄使用多個(gè)限定符,則必須按照表中所列順序?qū)⑵涮砑拥侥夸浢Q(chēng)中。
配置 | 描述 |
---|---|
MCC 和 MNC | 移動(dòng)設(shè)備國(guó)家代碼 (MCC),(可選)后跟設(shè)備 SIM 卡中的移動(dòng)設(shè)備網(wǎng)絡(luò)代碼 (MNC)。 |
語(yǔ)言和區(qū)域 | 語(yǔ)言通過(guò)由兩個(gè)字母組成的 ISO 639-1 語(yǔ)言代碼進(jìn)行定義,可以選擇后跟兩個(gè)字母組成的 ISO 3166-1-alpha-2 區(qū)域碼(前綴用小寫(xiě)字母 r)。 |
布局方向 | 應(yīng)用的布局方向。ldrtl 是指“布局方向從右到左”。 |
smallestWidth | 屏幕的基本尺寸,由可用屏幕區(qū)域的最小尺寸指定。 |
可用寬度 | 指定資源應(yīng)使用的最小可用屏幕寬度。 |
可用高度 | 指定資源應(yīng)使用的最小可用屏幕高度。 |
屏幕尺寸 | 屏幕是小尺寸、標(biāo)準(zhǔn)尺寸還是大尺寸。 |
屏幕縱橫比 | 屏幕是否為寬屏。 |
圓形屏幕 | 屏幕是否為圓形屏幕。 |
廣色域 | 屏幕是否具有廣色域。 |
高動(dòng)態(tài)范圍 | 屏幕是否具有 HDR 功能。 |
屏幕方向 | 當(dāng)前的設(shè)備方向。類(lèi)似 port,land。 |
夜間模式 | 是否夜間模式。 |
屏幕像素密度 | 屏幕分辨率與屏幕尺寸的比值。類(lèi)似 ldpi,mdpi,hdpi,xhdpi 等。 |
平臺(tái)版本(API 級(jí)別) | 設(shè)備支持的 API 級(jí)別。 |
3. 添加應(yīng)用資源
Android Studio 可以幫助我們通過(guò)多種方式添加新資源和備用資源,具體取決于我們要添加的資源的類(lèi)型。接下來(lái)我們學(xué)習(xí)如何添加基本的資源文件、如何更改資源的位置以及資源合并的原理。
3.1 添加 XML 資源文件
如果我們需要添加任何 XML 資源文件,請(qǐng)按照以下步驟操作:
點(diǎn)擊 Project 窗口中的目標(biāo)應(yīng)用模塊(在 Android 或 Project 視圖中時(shí)),然后依次選擇 File > New > Android resource file;
在對(duì)話框中填寫(xiě)詳細(xì)信息:
-
File name:輸入 XML 文件的名稱(chēng)(不需要輸入 .xml 后綴);
-
Resource type:選擇要?jiǎng)?chuàng)建的資源的類(lèi)型;
-
Root element:為文件選擇根 XML 元素(如果適用)。某些資源類(lèi)型僅支持一種類(lèi)型的根元素,因此這項(xiàng)可能無(wú)法修改,具體取決于上面選擇的資源類(lèi)型;
-
Source set:選擇要將文件保存到的源代碼集;
-
Directory name:目錄命名方式必須特定于資源類(lèi)型和配置限定符;
-
Available qualifiers:我們可以選擇左側(cè)列表中的限定符。
添加完所需的所有限定符之后,點(diǎn)擊 OK。
3.2 添加資源目錄
如果我們需要添加新的資源目錄,請(qǐng)按照以下步驟操作:
點(diǎn)擊 Project 窗口中的目標(biāo)應(yīng)用模塊,然后依次選擇 File > New > Android resource directory;
在對(duì)話框中填寫(xiě)詳細(xì)信息:
-
Directory name:目錄命名方式必須特定于資源類(lèi)型以及配置限定符的組合。
-
Resource type:選擇要?jiǎng)?chuàng)建的資源的類(lèi)型。
-
Source set:選擇要將布局保存到的源代碼集。
-
Available qualifiers:我們可以選擇左側(cè)列表中的限定符。
添加完所需的所有限定符之后,點(diǎn)擊 OK。
3.3 更改資源目錄
默認(rèn)情況下,我們的資源位于 module-name/src/source-set-name/res/。例如,模塊的主源代碼集的資源位于 src/main/res/,調(diào)試源代碼集的資源則位于 src/debug/res/。
不過(guò),我們可以使用 sourceSets {} 塊中的 res.srcDirs 屬性將這些路徑更改為任何其他位置(相對(duì)于 build.gradle 文件)。例如:
android {
sourceSets {
main {
res.srcDirs = ['resources/main']
}
debug {
res.srcDirs = ['resources/debug']
}
}
}
我們還可以為一個(gè)源代碼集指定多個(gè)資源目錄,構(gòu)建工具會(huì)將它們合并在一起。例如:
android {
sourceSets {
main {
res.srcDirs = ['res1', 'res2']
}
}
}
3.4 資源合并原理
最終 APK 文件中的資源可能有 3 個(gè)不同的來(lái)源:
-
主源代碼集(通常位于 src/main/res/);
-
構(gòu)建變體源代碼集;
-
Android 庫(kù) (AAR)。
如果來(lái)自各個(gè)源代碼集或庫(kù)的所有資源都是唯一的,則它們均會(huì)添加到最終 APK 中。如果某項(xiàng)資源的文件名在其資源類(lèi)型目錄和資源限定符(如果已定義)中都是唯一的,系統(tǒng)即會(huì)將該資源視為唯一的。
如果存在同一資源的兩個(gè)或多個(gè)匹配版本,則只有一個(gè)版本會(huì)包含在最終 APK 中。構(gòu)建工具會(huì)根據(jù)以下優(yōu)先級(jí)順序(左側(cè)的優(yōu)先級(jí)最高)選擇要保留的版本:
構(gòu)建變體 > build 類(lèi)型 > 產(chǎn)品變種 > 主源代碼集 > 庫(kù)依賴(lài)項(xiàng)
例如,如果主源代碼集包含:
-
res/layout/foo.xml
-
res/layout-land/foo.xml
并且調(diào)試 build 類(lèi)型包含:
- res/layout/foo.xml
則最終 APK 會(huì)包括來(lái)自調(diào)試 build 類(lèi)型的 res/layout/foo.xml 和來(lái)自主源代碼集的 res/layout-land/foo.xml。
Tips:當(dāng)我們的構(gòu)建配置為一個(gè)給定的源代碼集指定了多個(gè)資源文件夾時(shí),如果這些來(lái)源之間存在沖突,則會(huì)發(fā)生錯(cuò)誤,并且合并會(huì)失敗,因?yàn)楦鱾€(gè)資源目錄的優(yōu)先級(jí)相同。
4. 小結(jié)
本節(jié)課程我們主要學(xué)習(xí)了 Android 的應(yīng)用資源類(lèi)型、備用限定及如何添加資源。本節(jié)課程的重點(diǎn)如下:
- 掌握應(yīng)用資源的分類(lèi)和備用資源限定符;
- 掌握添加資源和資源合并的原理。