37、Android編寫應用-添加應用資源

位圖和佈局等應用資源會劃歸到各個模塊的 res/ 目錄內的類型專屬目錄中。您還可以添加各個文件的備用版本,這些版本針對不同的設備配置進行了優化(例如,適用於高密度屏幕的位圖的高分辨率版本)。

Android Studio 可以幫助您通過多種方式添加新資源和備用資源,具體取決於您要添加的資源的類型。本頁介紹瞭如何添加基本的資源文件、如何更改資源的位置以及資源合併的工作原理。

您還應該查看以下頁面,詳細瞭解如何創建特定的資源類型:

如需瞭解如何通過應用代碼引用資源,請參閱提供資源

添加 XML 資源文件

儘管上文鏈接的頁面介紹了專門面向每種資源類型的工作流程,但您可以通過執行以下步驟添加任何 XML 資源文件:

  1. 點擊 Project 窗口中的目標應用模塊(在 Android 或 Project 視圖中時),然後依次選擇 File > New > Android resource file

  2. 在對話框中填寫詳細信息:
    • File name:輸入 XML 文件的名稱(不需要輸入 .xml 後綴)。
    • Resource type:選擇要創建的資源的類型。
    • Root element:爲文件選擇根 XML 元素(如果適用)。某些資源類型僅支持一種類型的根元素,因此這項可能無法修改,具體取決於上面選擇的資源類型。
    • Source set:選擇要將文件保存到的源代碼集
    • Directory name:目錄命名方式必須特定於資源類型和配置限定符。因此,除非您想手動將配置限定符添加到目錄名稱(請改爲參閱 Available qualifiers),否則不應修改此項。
    • Available qualifiers:您可以通過點擊左側列表中的限定符,然後點擊 Add 圖標  添加可用限定符,而不是爲佈局目錄輸入配置限定符。
  3. 添加完所需的所有限定符之後,點擊 OK

提示:右鍵點擊 res 文件夾中的現有資源目錄,然後依次選擇 New > type-name resource file。這會打開簡化版本的 New Resource File 對話框,該對話框特定於您所需的資源類型。

提示:某些複雜的資源需要多個 XML 資源文件。例如,動畫矢量可繪製對象具有矢量可繪製對象和動畫對象,這需要至少三個 XML 文件。如果您需要重複使用這三個單獨的 XML 文件中的一個或多個,可以將其保留。但是,如果這些 XML 文件僅用於這一個動畫矢量可繪製對象,則您可以改爲使用 Android 資源打包工具 (AAPT) 中提供的內嵌資源格式。藉助 AAPT,您可以在一個 XML 文件中定義所有這三種資源。如需瞭解詳情,請參閱內嵌複雜的 XML 資源

添加資源目錄

如果您需要添加新的資源目錄,請按照以下步驟操作:

  1. 點擊 Project 窗口中的目標應用模塊,然後依次選擇 File > New > Android resource directory

  2. 在對話框中填寫詳細信息:
    • Directory name:目錄命名方式必須特定於資源類型以及配置限定符的組合。因此,除非您想手動將配置限定符添加到目錄名稱(請改爲使用 Available qualifiers),否則不應修改此項。
    • Resource type:選擇要創建的資源的類型。
    • Source set:選擇要將佈局保存到的源代碼集。
    • Available qualifiers:您可以通過點擊左側列表中的限定符,然後點擊 Add 圖標  添加可用限定符,而不是爲佈局目錄輸入配置限定符。
  3. 添加完所需的所有限定符之後,點擊 OK

更改資源目錄

默認情況下,您的資源位於 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']
            }
        }
    }
    

注意:如果兩個或多個資源目錄包含同一資源文件,則進行資源合併時會出錯。

如需瞭解詳情,請參閱源代碼集

資源合併

最終 APK 文件中的資源可能有 3 個不同的來源:

如果來自各個源代碼集或庫的所有資源都是唯一的,則它們均會添加到最終 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

但是,當您的構建配置爲一個給定的源代碼集指定了多個資源文件夾時,如果這些來源之間存在衝突,則會發生錯誤,並且合併會失敗,因爲各個資源目錄的優先級相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章