亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

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 會檢測當前設備配置并為應用加載合適的資源。

我們如何為一組資源指定配置特定的備用資源呢?分兩步:

  1. 在 res/ 中創建以 < resources_name >-< config_qualifier > 形式命名的新目錄;
    • < resources_name > 是相應默認資源的目錄名稱;
    • < config_qualifier > 是指定要使用這些資源的各個配置限定符的名稱。
  2. 將相應的備用資源保存在此新目錄下,這些資源文件必須與默認資源文件完全同名。

例如,以下是一些默認資源和屏幕像素密度備用資源:

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 窗口中的目標應用模塊(在 AndroidProject 視圖中時),然后依次選擇 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 的應用資源類型、備用限定及如何添加資源。本節課程的重點如下:

  • 掌握應用資源的分類和備用資源限定符;
  • 掌握添加資源和資源合并的原理。