Android 資源組織和存取


在許多Android專案中,有很多東西要用來建立一個良好的Android應用程式。除了編碼應用各種資源,如:點陣圖,顏色,布局定義,使用者介面字串,動畫,靜態內容。在res/目錄下,這些資源一直保持在各自子目錄。

這一小節將學習如何組織應用程式資源,指定替代資源,並在應用程式存取它們。

組織資源

將每種型別的資源在一個特定專案的 res/目錄的子目錄。例如,這裡有一個簡單的專案檔案層次:

MyProject/
    src/  
        MyActivity.java  
    res/
        drawable/  
            icon.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml  

 res/目錄中包含不同的子目錄的不同資源。在這裡有一個影象資源,兩個布局資源和一個字串資原始檔。下表給出了詳細的專案在 res/目錄裡面支援的資源。

目錄 資源型別
anim/ 定義屬性的動畫XML檔案。它們被儲存在res/anim/檔案夾,並從R.anim類存取
color/ 定義的顏色狀態列表的XML檔案。它們被儲存在res/color/ ,並從R.color類存取
drawable/ 像被編譯成點陣圖。.png, .jpg, .gif 或XML檔案,狀態列表,圖形,動畫可繪製的影象檔案。它們被儲存在res/drawable/,並可從R.drawable類存取
layout/ 定義使用者介面布局的XML檔案。它們被儲存在res/layout/,並可從R.layout類存取
menu/ 定義應用程式選單,如選項選單,上下文選單或子選單的XML檔案。它們被儲存在res/menu/,並可從R.menu類存取
raw/ 任意檔案儲存在其原始形式。您需要callResources.openRawResource()與所述資源ID,即R.raw.filename來開啟這樣的原始檔案
values/ 包含簡單的值,如字串,整數和顏色的XML檔案。例如,這裡有一些檔案名約定資源,可以建立在該目錄中:
  • arrays.xml資源陣列,並可從R.array類存取

  • integers.xml資源整數,並可從R.integerclass存取

  • bools.xml資源布林型,並可從R.bool類存取

  • colors.xml為顏色值,並可從R.color類存取

  • dimens.xml為維度值,並可從R.dimen類存取

  • strings.xml為字串值,並且可從R.string類存取

  • styles.xml為樣式並可從R.style類存取

xml/ 可以通過呼叫Resources.getXML()來讀取在執行時任意的XML檔案。可以在這裡儲存各種組態檔案,這些檔案可在執行時使用

替代資源

應用程式提供替代資源以支援特定的裝置組態。例如,包括替代繪製資源(ie.images),針對不同的語言不同的螢幕解析度並替代字串資源。在執行時Android 檢測當前裝置的組態,並為應用程式載入適當的資源。

要指定一組資源的組態具體的替代,請遵循以下步驟:

  • 建立新目錄在res/ 目錄下,命名形式如 <resources_name>-<config_qualifier>。這裡resources_name 是在上表中提到的資源,如layout,drawable 等限定符將指定一個單獨的組態,要使用這些資源。可以檢視官方文件的完整列表,限定符為不同型別的資源。

  • 在這個新的目錄中儲存相應的替代資源。資原始檔必須被命名為預設的資原始檔,如下面的例子所示的完全一樣,但這些檔案具有特定內容的替代。例如,雖然影象的檔案名是相同的,但對高解析度螢幕,其解析度會很高。

下面是一個例子,它指定一個預設的螢幕和高解析度螢幕的替代影象的影象。

MyProject/
    src/  
        MyActivity.java  
    res/
        drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml 

下面是另一個例子,指定一種預設語言為阿拉伯語並指定替代布局。

MyProject/
    src/  
        MyActivity.java  
    res/
        drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        layout-ar/
            main.xml
        values/  
            strings.xml 

存取資源

在應用程式開發中,需要存取定義的資源,無論是在程式碼還是在布局XML檔案。下面的部分介紹了如何存取資源在這兩個場景:

存取資原始碼

當Android應用程式被編譯時,會產生一個R類,其中包含在res/ 目錄中的所有可用資源的資源ID。使用R類直接存取該子目錄和資源名稱或資源ID。 

範例:

要存取 res/drawable/myimage.png,並設定一個ImageView 可使用下面的程式碼:

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

下面第一行程式碼,使用R.id.myimageview  id 為myimageview定義布局檔案。第二行程式碼使用 R.drawable.myimage 得到的影象名稱myimage ,在 /res子目錄下。

範例:

考慮在下一個例子 res/values/strings.xml 有以下定義:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string  name="hello">Hello, World!</string>
</resources>

現在,可以設定一個TextView物件msg 文字使用資源ID如下:

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);

範例:

考慮一個布局res/layout/activity_main.xml 如以下的定義:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:orientation="vertical" >
<TextView android:id="@+id/text"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="Hello, I am a Button" />
</LinearLayout>

這個應用程式程式碼的一個活動將載入此布局,在onCreate()方法如下:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
}

XML中存取資源

考慮下面的XML資源res/values/strings.xml檔案,包括顏色資源和一個字串資源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

現在,可以利用這些資源,在下面的布局檔案中設定文字顏色和文字字串如下:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

現在,如果將再次通過前面的章節了解,例如:Hello World!應用,將有助於更好的理解本小節介紹的概念。了解在前面的小節中是如何利用各種資源的基本操作。