Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android資源文件之創建與訪問

Android資源文件之創建與訪問

編輯:關於Android編程

Android適配之創建別名資源

如果你想將某一資源用於多種設備配置(但是不想作為默認資源提供), 則無需將同一資源放入多個備用資源目錄中。相反,可以(在某些情況下)創建備用資源,充當保存在默認資源目錄下的資源的別名。

注: 並非所有資源都會提供相應的機制讓你創建指向其他資源的別名。特別是, xml/目錄中的動畫資源、菜單資源、原始資源以及其他未指定的資源均不提供此功能。

例如,加入你有有一個應用圖片icon.jpg, 並且需要不同區域設置獨特版本。但是,加拿大英語和加拿大法語這兩種區域設置需要同一版本。你可能會認為需要將相同的圖像復制到加拿大英語和法語對應的資源目錄中,但事實並非如此,相反,你可以將二者的圖像另存為icon_ca.png(除icon.png以外的任何名稱),並將其放入默認res/drawable/目錄中。然後,在res/drawable-en-rCA/res/drawable-fr-rCA/中創建icon.xml文件,使用<bitmap>元素引用icon_ca.png資源。這樣,您只需要儲存PNG文件的一個版本和兩個指向該版本的小型xml文件。(XML文件示例如下)

Drawable

要創建指向現有 Drawable的別名, 請使用<bitmap>元素。例如:


如果將此文件另存為icon.xml (例如,在備用資源目錄中,另存為res/drawable-en-rCA/),則會編譯到可作為R.drawable.icon引用的資源中,但實際上它是R.drawable.icon_ca資源(保存在res/drawable/中)的別名。

布局

要創建指向現有布局的別名,請使用包裝在<merge>中的<include>元素。例如:



    

如果將此文件另存為main.xml,則會編譯到可作為R.layout.main引用的資源中, 但實際上它是R.lyout.main_ltr資源的別名。

字符串和其他簡單值

要創建指向現有字符串的別名, 只需要將所需字符串的資源ID用作新字符串的值即可。例如:



    Hello
    @string/hello

R.string.hi資源現在是R.string.hello的別名

其他簡單值的原理相同。 例如,顏色:



    #f00
    @color/red

利用資源提供最佳設備兼容性

為了提供最佳設備兼容性,請始終為應用正確運行所必需的資源提供默認資源。然後,使用配置限定符為特定的設備配置創建備用資源。

這條規則有一個例外:如果應用的 minSdkVersion 為 4 或更高,則在提供帶屏幕密度限定符的備用 Drawable 資源時,不需要默認 Drawable 資源。 即使沒有默認 Drawable 資源,Android 也可以從備用屏幕密度中找到最佳匹配項並根據需要縮放位圖。 但是,為了在所有類型的設備上提供最佳體驗,您應該為所有三種類型的密度提供備用 Drawable。

Android 如何找到最匹配資源

當您請求要為其提供備用資源的資源時,Android會根據當前的設備配置選擇要在運行時使用的備用資源。為演示 Android如何選擇備用資源,假設以下 Drawable 目錄分別包含相同圖像的不同版本:

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

同時,假設設備配置如下:

區域設置 = en-GB
屏幕方向 = port
屏幕像素密度 = hdpi
觸摸屏類型 = notouch
主要文本輸入法 = 12key

通過將設備配置與可用的備用資源進行比較,Android 從 drawable-en-port 中選擇 Drawable

系統使用以下邏輯決定要使用的資源:

1. 淘汰與設備配置沖突的資源文件。

drawable-fr-rCA/ 目錄與 en-GB 區域設置沖突,因而被淘汰。
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

例外:屏幕像素密度是唯一一個未因沖突而被淘汰的限定符。 盡管設備的屏幕密度為 hdpi,但是 drawable-port-ldpi/ 未被淘汰,因為此時每個屏幕密度均視為匹配。

2. 選擇列表中(下一個)優先級最高的限定符。(先從 MCC 開始,然後下移。)

3. 是否有資源目錄包括此限定符?

若無,請返回到第2步,看看下一個限定符。(在該示例中,除非達到語言限定符,否則答案始終為“否”。) 若有,請繼續執行第 4 步。

4. 淘汰不含此限定符的資源目錄。在該示例中,系統會淘汰所有不含語言限定符的目錄。

例外:如果涉及的限定符是屏幕像素密度,則 Android 會選擇最接近設備屏幕密度的選項。通常,Android 傾向於縮小大型原始圖像,而不是放大小型原始圖像。

5. 返回並重復第 2 步、第 3 步和第 4 步,直到只剩下一個目錄為止。在此示例中,屏幕方向是下一個判斷是否匹配的限定符。因此,未指定屏幕方向的資源被淘汰:

訪問資源

代碼訪問資源

[<package_name>.]R.<resource_type>.<recource_name>

<package_name> 資源所在包的名稱(如果引用的資源來自於你自己的資源包,則不需要).

<resource_type> 資源類型的R子類。

<resource_name> 是不帶擴展名的資源文件名,或XML元素中的android:name屬性值(如果資源是簡單值)

// Load a background for the current screen from a drawable resource
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

在XML中訪問資源

語法

[<package_name>.]R.<resource_type>.<recource_name>

是資源所在包的名稱(如果引用的資源來自同一包,則不需要) 是資源類型的 R 子類 是不帶擴展名的資源文件名,或 XML 元素中的 android:name 屬性值(如果資源是簡單值)。


   #f00
   Hello!


引用樣式屬性

您可以通過樣式屬性資源在當前應用的風格主題中引用某個屬性的值。 通過引用樣式屬性,您可以不采用為 UI 元素提供硬編碼值這種方式,而是通過為 UI 元素設置樣式,使其匹配當前風格主題提供的標准變型來定制這些元素的外觀。引用樣式屬性的實質作用是,“在當前風格主題中使用此屬性定義的樣式”。

要引用樣式屬性,名稱語法幾乎與普通資源格式完全相同,只不過將 at 符號 (@) 改為問號 (?),資源類型部分為可選項。 例如:

?[:][/]


訪問平台資源

Android 包含許多標准資源,例如樣式、風格主題和布局。要訪問這些資源,請通過 android 包名稱限定您的資源引用。例如,您可以將 Android 提供的布局資源用於 ListAdapter 中的列表項:

//simple_list_item_1 是平台為 ListView 中的項目定義的布局資源。您可以使用它,而不必自行創建列表項布局。
setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray));
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved