Android的應用資源簡述

前言

學習是一件持久的事,只有達到一定的量才能形成量變,程序員的學習也是如此

概述

資源是指在代碼中使用的附加文件和靜態內容,例如位圖,佈局定義,界面字符串,動畫說明等。您應始終外部化應用資源(例如圖像和代碼中的字符串),以便單獨對其進行維護。此外,您還應爲特定設備配置提供備用資源,方法是將其進行分組並放入專門命名的資源目錄中。在運行時,Android 會根據當前配置使用合適的資源。例如,您可能需根據屏幕尺寸提供不同的界面佈局,或根據語言設置提供不同的字符串。

外部化應用資源後,您便可使用在項目 R 類中生成的資源 ID 來訪問這些資源。本文檔會介紹如何對 Android 項目中的資源進行分組,如何爲特定的設備配置提供備用資源,以及如何從您的應用代碼或其他 XML 文件訪問這些資源。

資源分類

您應將各類資源放入到項目res/目錄的特定目錄中在這裏插入圖片描述
res/目錄中支持的資源目錄
在這裏插入圖片描述
提供備用資源
幾乎每個應用都有備用資源,以便支持特定的設備配置,我下展示如何創建備用資源:

  1. 在res/中創建以 resource_name - config_qualifier形式命名的新目錄
    resource_name:是相應的默認資源的目錄名稱(如上圖所示)。
    qualifiter :是指定要使用這些資源的各個配置的名稱(如表 2 中所定義)。
    您可以追加多個 。以短劃線將其分隔。

  2. 將相應的備用資源保存在此新目錄下。這些資源文件必須與默認資源文件完全同名。

限定符命名規則
  • 您可以爲單組資源指定多個限定符,並使用短劃線分隔。例如,drawable-en-rUS-land 適用於屏幕方向爲橫向的美國英語設備。
  • 不能嵌套備用資源目錄。例如,您的目錄不能爲 res/drawable/drawable-en/。
  • 值不區分大小寫。在處理之前,資源編譯器會將目錄名稱轉換爲小寫,以免不區分大小寫的文件系統出現問題。名稱中使用的所有大寫字母只是爲了便於認讀。
  • 每種限定符類型僅支持一個值。例如,若要對西班牙語和法語使用相同的可繪製對象文件,則您不能擁有名爲 drawable-rES-rFR/ 的目錄,而是需要兩個包含相應文件的資源目錄,如 drawable-rES/ 和 drawable-rFR/。然而,您實際無需在兩處複製相同的文件。相反,您可以創建指向資源的別名。
創建別名資源

如果您想將某一個資源用於多種設備,則無需將同一個資源放入多個備用資源目錄中。相反你可以創建備用資源,充當默認資源目錄中所保存資源的別名

  • 可繪製對象:如果要創建指向現有的可繪製對象,請使用 drawable 元素
    - 將要使用的資源放在默認的drawable目錄中.
    - 在values下創建一個引用drawable中的圖片的資源文件
    - 在不同的使用的目錄中引用在values中定義的drawable對象

  • 佈局:
    - 如要創建指向現有佈局的別名,請使用包裝在 中的 元素
    - 字符串和其他簡單值,如要創建指向現有字符串的別名,您只需將所需字符串的資源 ID 用作新字符串的值

訪問應用資源

在應用中提供資源後,您可通過引用其資源 ID 來應用該資源。所有資源 ID 都在您項目的 R 類中進行定義,該類由 aapt 工具自動生成。
編譯應用時,aapt 會生成 R 類,其中包含 res/ 目錄中所有資源的資源 ID。每個資源類型都有對應的 R 子類(例如,R.drawable 對應所有可繪製對象資源),而該類型的每個資源都有對應的靜態整型數(例如,R.drawable.icon)。該整型數就是可用來檢索資源的資源 ID。

資源ID的組成:

  • 資源類型:每個資源都被分到一個“類型”組中,例如 string、drawable 和 layout。

  • 資源名稱:它是不包括擴展名的文件名;或是 XML android:name 屬性中的值(如資源是字符串等簡單值)。

  • 資源的訪問:在代碼中使用 R.string.hello 在XML文件中@string/hello

    在代碼中訪問資源:
    你可以你參數的方式傳入一個資源id,進而在代碼中使用資源或者是利用 Resources 中的方法檢索個別資源,並且您可通過 getResources() 獲得該資源的實例。
    語法:[<package_name>.]R.<resource_type>.<resource_name>


class MainActivity : AppCompatActivity() {
    lateinit var imageView: ImageView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        imageView = findViewById(R.id.imageviewid)
        // 使用資源id的方式訪問資源
        imageView.setImageResource(R.drawable.ic_launcher_background)
        //使用Resourece對象實現對資源的訪問
        imageView.setImageDrawable(resources.getDrawable(R.drawable.ic_launcher_background))        
    }
}

在XML中訪問資源:
您可以使用對現有資源的引用,爲某些 XML 屬性和元素定義值。創建佈局文件時,爲給您的微件提供字符串和圖像,您會經常這樣做。
語法:@[<package_name>:]<resource_type>/<resource_name>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageviewid"/>
</LinearLayout>

引用樣式屬性:
利用樣式屬性資源,您可以在當前應用的主題背景中引用某個屬性的值。藉助引用樣式屬性,在自定義界面元素的外觀時,您無需採用提供硬編碼值這種方式,您可以通過爲其設置樣式,以匹配當前主題背景提供的標準變體來達成目的。引用樣式屬性的實質作用是,“在當前主題背景中使用此屬性定義的樣式”。

如要引用樣式屬性,名稱語法幾乎與普通資源格式完全相同,區別在於您需將 at 符號 (@) 改爲問號 (?),並且資源類型部分爲可選項。例如
語法:?[<package_name>:][<resource_type>/]<resource_name>

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

訪問原始文件
儘管並不常見,但您的確有可能需要訪問原始文件和目錄。如果確有需要,則將文件保存在 res/ 中並沒有用,因爲從 res/ 讀取資源的唯一方法是使用資源 ID。您可以改爲將資源保存在 assets/ 目錄中。

保存在 assets/ 目錄中的文件沒有資源 ID,因此您無法通過 R 類或在 XML 資源中引用它們。您可以改爲採用類似普通文件系統的方式查詢 assets/ 目錄中的文件,並利用 AssetManager 讀取原始數據。

不過,如果您只需要讀取原始數據(例如視頻文件或音頻文件)的能力,則可將文件保存在 res/raw/ 目錄中,並利用 openRawResource() 讀取字節流。

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