Android應用資源—訪問資源(Accessing Resources)

一旦在應用程序中提供瞭資源,就能夠通過引用資源ID來使用資源。所有的資源ID都在工程的R類中被定義,R類是由aapt工具自動生成的。

當應用程序被編譯是,aapt會生成R類,它包含瞭res/目錄中的所有資源的資源ID。對於每種類型的資源,會有一個R子類(例如,R.drawable類針對所有可描畫資源),並且針對每種類型的資源,都會有一個靜態的整數(如,R.drawable.icon)。這個整數就是能夠用於獲取資源的資源ID。

盡管R類是指定資源ID的地方,但是不需要查看它來發現資源ID,一個資源ID始終由以下信息組成:

資源類型:每種資源都被分組到一個類型中,如string、drawable以及layout等。

資源名稱:它既可以是除去擴展名的文件名,也可以是XML文件中android:name屬性的值(如果資源是一個像字符串那樣的簡單值)。

有兩種方法能夠訪問資源:

在代碼中:使用來自R類子類的靜態整數,如R.string.hello。string是資源類型,hello是資源名稱。有一些Android API能夠使用這種資源格式訪問資源。

在XML中:還可以使用相當於R類中定義的資源ID的特殊XML語法,如@string/hello。

string資源類型,hello是資源名稱。能夠在XML資源中使用這種語法,把資源中提供的任何值放到被期望的地方。

在代碼中訪問資源

能夠把資源ID作為參數傳遞給方法來使用資源。例如,使用setImageResource()方法給一個ImageView對象設置要使用的res/drawable/myimage.png資源:

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

也能夠使用方法獲取資源中的個別資源,用getResources()方法獲取資源的一個示例對象。

語法

在代碼中引用資源的語法如下:

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

1.<package_name>是要定位的資源所在的包的名字(當引用的資源與代碼在同一個包中時,不需要包名)。

2.<resource_type>是R的子類,代表資源的類型

3.<resource_name>既可以是不帶擴展名的資源文件名,也可以是XML元素中android:name屬性值(對簡單值資源)

使用場景

有許多接收資源ID作為參數的方法,並也能夠使用在Resources類中的方法來獲取資源。使用Context.getResources()方法能夠獲取一個Resources對象的實例。

以下是在代碼中訪問資源的一些例子:

// 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);

警告:你不需要手動的編輯R.java文件—它是在工程編譯時,由aapt工具生成的,任何改變都會在下次編譯時被覆蓋。

在XML中訪問資源

在給一些XML屬性定制值時,能夠引用一個既存的資源值。在創建佈局資源時,會經常這樣做,給weidget提供字符串和圖片。

例如,如果在佈局中添加一個Button,應該使用一個字符串資源作為按鈕的文本:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit"/>

語法

以下是在XML資源中引用資源的語法:

@[<package_name>:]<resource_type>/<resource_name>

<package_name>是被搜索的資源所在的包的名字(從同一個包中引用資源時,不需要這個包名)。

<resource_type>是R的子類,代表資源的類型

<resource_name>既可以是不帶擴展名的資源文件名,也可以是XML元素中android:name屬性值(對簡單值資源)

使用場景

在一些情況中,必須在XML中使用資源(如,把一個圖片用於Widget的可描畫資源),但是可以在任何能夠接收簡單值的地方使用XML中的資源,如下列資源文件包含瞭一個顏色資源和字符串資源:

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

在下面的佈局文件中使用上述資源來設置文本的顏色和文本字符串:

<?xml version="1.0" encoding="utf-8"?>
<EditTextxmlns: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"/>

這種情況下因為是引用自己包中的資源,所以不需要指定包名。如果要引用系統資源,則需要包含包名,如:

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

註意:應該在任何時候都使用字符串資源,以便應用程序能夠針對其他語言進行本地化。

甚至能夠使用XML中的資源來創建別名,例如,可以創建一個drawable類型的資源,這個資源是另一個drawable類型資源的別名:

<?xml version="1.0" encoding="utf-8"?>
<bitmapxmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable"/>

引用樣式的組件屬性

引用樣式資源的組件屬性允許引用當使用的主題中的一個樣式作為屬性值。引用樣式的組件屬性屬性通過把樣式主題與當前主題所支持的各種標準進行匹配,從而達到定制UI元素外觀的效果,而不是提供硬編碼值。引用樣式的組件屬性實際上是,通過這個屬性來使用在當前的主題中定義的樣式。

要引用樣式的組件屬性的語法幾乎與普通的資源格式完全相同,不同的是@被?所替代,並且資源類型部分是可選的。例如:

?[<package_name>:][<resource_type>/]<resource_name>

例如,以下示例說明瞭設置文本顏色的一個屬性如何能夠跟系統主題的“primary”文本顏色相匹配:

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

android:textColor屬性指定瞭在當前主題中一個樣式屬性的名字。Android就會使用這個值,把android:textColorSecondary樣式屬性值作為widget中的android:textColor的值。因為系統資源工具瞭解在這個內容中所期望資源屬性,所以不需要明確的指定類型(上例中完整的引用應該是?android:attr/textColorSecondary—可以忽略attr類型)

訪問平臺資源

Android包含很多標準資源,如樣式、主題和佈局等。要訪問這些資源,就要使用完全的android包名來引用資源。如,Android在ListAdapter類中提供瞭用於列表項的佈局資源:

setListAdapter(newArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

在這個列子中,simple_list_item_1是平臺給ListView對象中的項目定義的佈局資源,可以使用它來替代自己要創建的用於列表項的佈局。

摘自 FireOfStar的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。