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