編輯:Android開發實例
前言
本章內容為Android開發者指南的Framework Topics/Application Resources/Accessing Resources章節,譯為"資源調用",版本為Android 3.2 r1,翻譯來自:"CodeGuy"。
Accessing Resource
譯者署名:CodeGuy
譯者鏈接:http://www.cnblogs.com/CodeGuy/
版本:Android 3.2 r1
資源的調用
當你在應用程序中提供了某種資源後(在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號一般的組成如下:
* 資源類型: 每種資源都會被分組到一種特定的資源類型,例如string
, drawable
,和 layout
。要了解更多關於不同的資源類型,見Resource Types。
* 資源名,同時也是:文件名,不包括拓展名;或者是XML 中android:name
屬性的值,
條件是這個資源是一個簡單的值(例如一個字符串)。
調用某個資源有兩種方法:
* 在代碼中調用:通過使用R.class 的相應子類中的靜態整形數值,例如:
R.string.hello
string
是資源類型,hello是資源名。當你通過這種方式提供資源的ID號時,有很多Android APIs 就可以調用你的相應資源了。詳見以下內容。
* 在XML中調用:通過特殊的XML語法同樣可以對應到你的R.class文件中的相關資源ID,例如:
@string/hello
string
是資源類型,hello是資源名。你可以在任何需要使用自己提供的資源的地方,通過這種語法在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>
* <package_name>
資源所在的包名 (當你要應用自己包下的資源時,該字段不需要填寫).
* <resource_type>
R類下對應一種特定資源類型的子類.(譯者注:如R.String)
* <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>
* <package_name>
資源所在的包名 (當你要應用自己包下的資源時,該字段不需要填寫)
* <resource_type>
R類下對應一種特定資源類型的子類.(譯者注:如R.String)
* <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)。
在應用程序中有些時候,如果想詢問用戶采取決定是或否所采取的特殊動作的回應,由停在原來的活動而不改變屏幕,可以使用警告對話框(Alert Dialog)。要使用一個警告對話
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
Android UI缺省的標題欄由android:label 定義,顯示在屏幕