當你在應用程式中提供了某種資源後(在Providing Resources中有討論),你就可以通過引用資源ID號來調用相關的資源。所有的資源ID號都在你工程下的R.class檔案中定義好,這是由aapt工具自動產生的。
當你的應用程式被編譯時間,aapt工具就會自動產生R.class 檔案,這個檔案中包含有res/
目錄下所有資源的
ID
號。對於每一種資源類型都有一個
R
的子類對應著(例如:
R.drawable
中包含著所有
drawable資源),並且對每個特定類型的所有資源都有一個靜態整型數值一一對應(例如:
R.drawable.icon
)。這個整型數值就是這個特定資源的
ID
號,你可以通過它來擷取你的對應資源。
雖然R.class檔案中定義著每種資源的ID號,但是你不應該也不需要到該檔案下去查看某個資源的ID號。一個資源的ID號一般的組成如下:
l 資源類型: 每種資源都會被分組到一種特定的資源類型,例如string
, drawable
, and layout
。要瞭解更多關於不同的資源類型,見Resource Types。
l 資源名,同時也是:檔案名稱,不包括拓展名;或者是XML 中android:name
屬性的值,
條件是這個資源是一個簡單的值(例如一個字串)。
調用某個資源有兩種方法:
l 在代碼中調用:通過使用R.class 的相應子類中的靜態整形數值,例如:
R.string.hello
string
是資源類型,hello是資源名。當你通過這種方式提供資源的ID號時,有很多Android APIs 就可以調用你的相應資源了。詳見:在代碼中調用資源。
l 在XML中調用:通過特殊的XML文法同樣可以對應到你的R.class檔案中的相關資源ID,例如:
@string/hello
string
是資源類型,hello是資源名。你可以在任何需要使用自己提供的資源的地方,通過這種文法在XML中調用。詳見:在XML中調用資源。
在代碼中調用資源
你可以把資源ID號作為方法的參數在代碼中調用該資源。例如,你可以設定一個ImageView通過調用setImageResource()
方法來使用
res/drawable/myimage.png
資源:
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
你也可以通過調用Resources
類
中的方法來擷取某一特定的資源,通過getResources()
方法可以得到
Resources
類
的一個執行個體。
文法
這是在代碼中引用資源的文法:
[<package_name>.]R.<resource_type>.<resource_name>
l <package_name>
資源所在的包名 (當你要應用自己包下的資源時,該欄位不需要填寫).
l <resource_type>
R類下對應一種特定資源類型的子類.(譯者註:如R.String)
l <resource_name>
可以是不包含檔案拓展名的資源檔名或者XML元素中android:name
屬性的值(僅限簡單的值,如字串)
瞭解更多關於每種資源類型的資訊以及如何引用它們,見Resource Types 。
用例
有很多方法可以接受資源的ID號作為參數,你可以通過Resources中的方法來擷取某種對應的資源。你可以通過Context.getResources()方法來獲得Resources類的一個執行個體。.
以下是在代碼中調用資源的一些例子:
註:通過一個drawable類型的資源給當前螢幕載入背景 getWindow()
.setBackgroundDrawableResource
(R.drawable.my_background_image) ;
註:通過從Resources對象擷取的字串給Activity 設定標題,因為該方法需要一個字元序 列而不是一個資源ID號
getWindow()
.setTitle
(getResources().getText
(R.string.main_title));
註:給當前螢幕載入自訂布局
setContentView
(R.layout.main_screen);
註:通過從Resources 執行個體擷取的動畫來設定一個動畫投影片mFlipper.setInAnimation
(AnimationUtils.loadAnimation(this,
R.anim.hyperspace_in));
註:通過資源ID號給TextView 類的對象設定顯示文字
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText
(R.string.hello_message);
特別提醒: 你不能自己手動修改R.java 檔案,這個檔案是在你的工程被編譯時間由aapt工具自動產生的。所有程式中的修改都會在工程下一次編譯時間重寫。
在XML中調用資源
你可以通過引用一個存在的資源來給一些XML的屬性和元素指定具體的值。你經常會在建立布局檔案的時候這樣做,給你的組件提供字串和映像。
例如,如果你添加一個按鈕到你的布局中,你應該使用一個字串資源來指定顯示在按鈕上的文字:
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/submit" />
譯者註:@string/submit即為你定義好的字串資源
文法
以下是在XML資源檔中引用資源的文法:
@[<package_name>:]<resource_type>/<resource_name>
l <package_name>
資源所在的包名 (當你要應用自己包下的資源時,該欄位不需要填寫)
l <resource_type>
R類下對應一種特定資源類型的子類.(譯者註:如R.String)
l <resource_name>
可以是不包含檔案拓展名的資源檔名或者XML元素中android:name
屬性的值(僅限簡單的值,如字串)
瞭解更多關於每種資源類型的資訊以及如何引用它們,見Resource Types 。
用例
在某些情況下你必須得在XML中使用資源(例如:給組件應用一個drawable映像),但是你可以在XML中任何可以接受簡單值的地方使用資源。例如,如果你有如下包含color(顏色)資源和string(字串)資源的資源檔:
<?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" />
在以下情況下在引用資源時你不需要指定包名,因為這些資源在你自己的當前包中。要引用一個系統資源,你需要在引用時聲明資源所在包名。例如:
<?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="@android:color/secondary_text_dark"
android:text="@string/hello" />
特別提醒:在需要用字串時,你應該堅持使用字串資源,因此你的應用程式就可以對其他語言進行本地化。關於建立可替代資源(例如本地化字串),見Providing Alternative Resources。
你甚至可以可以在XML檔案中用資源來建立別名。例如,你可以建立一個drawable類型的資源,這個資源是另一個drawable類型資源的別名:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/other_drawable" />
這個聽起來像是多餘的介紹,但是在使用可替代資源的時候會很有用。瞭解更多關於Creating alias resources。
引用樣式屬性
一個樣式屬性資源允許你在當前應用的主題中引用一個屬性的值。引用一個樣式屬性允許你通過樣式化UI元素以匹配當前主題提供的標準變化來定製UI元素的外觀,而不是通過提供一個硬式編碼值。引用樣式屬性從基本上說,“使用當前主題中的屬性已定義好的樣式”。
引用樣式屬性,其名稱的文法與普通的資源格式幾乎是等同的,但是取代符號(@),這使用的是問號(?),資源類型部分是可選的。例如:
?[<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" />
在這,android:textColor 屬性指定了當前主題中一個樣式屬性的名稱。Android 現在使用應用於android:textColorSecondary 樣式屬性的值作為該組件中android:textColor 的值。因為系統資源工具知道這個屬性資源就是環境所期望的,所以你不需要顯式地聲明是那個類型(這個類型可能是?android:attr/textColorSecondary)—你可以排除掉attr類型。
調用平台資源
Android中包含有很多標準的資源,例如styles(樣式)、themes(主題)、layouts(布局)等等。要調用這些資源,需要通過android包名來限定你的資源。例如,Android提供了一個布局資源,你可以在ListAdapter中用以羅清單項目。
譯者註:ListAdapter是指列表適配器
setListAdapter
(new ArrayAdapter
<String>(this, android.R.layout.simple_list_item_1, myarray));
在這個例子中,simple_list_item_1是平台為ListView的表項定義的布局資源。你可以使用這個列表布局,而不需要自己建立表項布局。(更多關於ListView,參見List View Tutorial)
歡迎轉載,轉載請註明出處:http://www.cnblogs.com/CodeGuy/