資源是您在代碼中使用到的并且在編譯時(shí)被打包進(jìn)您的應(yīng)用程序的附加文件。Android支持多種不同的文件,包括XML、PNG和JPEG文件。XML文件的格式?jīng)Q定于其描述的內(nèi)容。這些文件將描述文件支持的類型、語法或格式。
處于加載效率的考慮,資源被從代碼中分離出來,而且XML文件被編譯進(jìn)二進(jìn)制代碼中。字符串,類似的會被壓縮存儲為更經(jīng)濟(jì)的格式。處于這樣或那樣的原因,Android平臺中會存在很多不同的資源和資源定義文件。
這些文件包括以下部分:
o 創(chuàng)建資源
o 使用資源
§ 在代碼中使用資源
§ 引用資源
§ 引用主體屬性
§ 使用系統(tǒng)屬性
o 更改資源
o 資源引用
o 術(shù)語表
配合資源引用文檔,Android提供了一套經(jīng)濟(jì)的資源處理技術(shù)。他轉(zhuǎn)化了大量的資源信息,使Android在運(yùn)行時(shí)無需了解文檔的內(nèi)容,僅僅在您需要的時(shí)候指導(dǎo)他在哪兒就可以了。
資源
這一節(jié)包含了與資源有關(guān)聯(lián)的術(shù)語表和一系列使用資源的代碼事例。更完整的Android資源指南請參看“資源”一章。
Android資源系統(tǒng)保存所有與代碼無關(guān)資源的存根。您可以使用Resources類訪問您應(yīng)用程序的資源;與應(yīng)用程序相關(guān)聯(lián)的資源實(shí)例可以通過Context.getResources()得到。
一
個(gè)應(yīng)用程序的資源可以被構(gòu)建系統(tǒng)在構(gòu)建時(shí)編譯進(jìn)二進(jìn)制的應(yīng)用程序里。為了使用資源,您需要正確的初始化您應(yīng)用程序中的資源樹并且構(gòu)建您的應(yīng)用程序。在構(gòu)建
過程的部分,每個(gè)資源的標(biāo)識被產(chǎn)生,您可以在代碼中使用他們。這些標(biāo)識允許編譯器校驗(yàn)?zāi)鷳?yīng)用程序中的代碼和資源定義是否匹配。
有關(guān)本章的其他細(xì)節(jié)請參見教程如何使用資源的部分。
創(chuàng)建資源
Android支持字符串,位圖和許多其他類型的資源。每一種資源定義文件的語法和格式及保存的位置取決于其依賴的對象。通常,您可以通過三種文件創(chuàng)建資源:XML文件(除位圖和原生文件外),位圖文件(作為圖片)和原生文件(所有其他的類型,比如聲音文件)。事實(shí)上,這里有兩種不同類型的XML文件,一種是作為資源被編譯近應(yīng)用程序,另一種怎是資源的描述,被aapt使用。下面的表格詳細(xì)說明了這些XML文件的類型和結(jié)構(gòu)。
您可以在您項(xiàng)目res/目錄下的適當(dāng)子目錄下創(chuàng)建和存儲資源文件。Android使用資源編譯器訪問資源所在的子目錄和格式化的文件。下面的表格列出了每一種資源的文件類型。參見“資源引用”一節(jié)可以了解關(guān)于對象、語法和格式方面的內(nèi)容。
目錄
|
資源類型
|
res/anim
|
XML文件編譯為楨序列動畫或者自動動畫對象。
|
res/drawable
|
.png,9.png,.jpg文件被編譯為Drawable資源子類型:
使用Resources.getDrawable(id)可以獲得資源類型
|
res/layout
|
資源編譯為屏幕布局器。參見“布局器”一章
|
res/values
|
XML 文件可以被編譯為多種資源
注意:不像其他res下的目錄,這個(gè)目錄可以包含多個(gè)資源描述文件。XML文件元素類型控制著這些資源被R類放置在何處。
這些文件可以自定義名稱。這里有一些約定俗成的文件。
- arrays.xml 定義數(shù)組。
- colors.xml 定義可繪制對象的顏色和字符串的顏色。使用Resources.getDrawable()和Resources.getColor()都可以獲得這些資源。
- dimens.xml 定義尺度。使用Resources.getDimension()可以獲得這些資源
- strings.xml 定義字符串(使用Resources.getString()或者更適合的Resources.getText()方法獲得這些資源。Resources.getText()方法將保留所有用于描述用戶界面樣式的描述符,保持復(fù)雜文本的原貌。
- styles.xml 定義樣式對象
|
res/xml
|
自定義的XML文件。這些文件將在運(yùn)行時(shí)編譯近應(yīng)用程序,并且使用Resources.getXML()方法可以在運(yùn)行時(shí)獲取。
|
res/raw
|
自定義的原生資源,將被直接拷貝入設(shè)備。這些文件將不被壓縮近您的應(yīng)用程序。使用帶有ID參數(shù)的Resources.getRawResource()方法可以獲得這些資源,比如R.raw.somefilename。
|
資源被最終編譯近APK文件。Android創(chuàng)建包裝類R,您可以用他找回資源。R包含一些與資源所在目錄同名的子類。
全局資源
- 很多資源都允許您定義顏色。Android接受web風(fēng)格的顏色定義-一組十六進(jìn)制的顏色值,按照以下序列排列:#RGB,#ARGB,#RRGGBB,#AARRGGBB。
- 所有的顏色都支持ALPHA通道,頭兩位十六進(jìn)制數(shù)字指定透明度。0在ALPHA通道中表示全透明,默認(rèn)值是不透明。
使用資源
這一節(jié)講述如何使用您所創(chuàng)建的資源,包括:
· 在代碼中使用資源 如何在代碼中使用資源。
· 如何引用其他資源中的資源 您可以從其他資源中引用資源。您可以重新使用資源內(nèi)部的通用資源。
· 支持資源更替 您可以在加載時(shí)依據(jù)語言、顯示配置和主機(jī)硬件的不同指定不同的資源。
在編譯時(shí),Android生成名為R的類。R包含您應(yīng)用程序所用到的所有的類。這個(gè)類包含一些與res下子目錄同名的子類。這些子類包含每一個(gè)您在資源文件中定義的資源的標(biāo)識。這些資源標(biāo)識可以在您的代碼中引用。這里有一段簡單的資源文件,包含一些文字,布局器和圖片資源。
注意:R類是自動生成的,并且它不能被手動修改。當(dāng)資源發(fā)生變動時(shí),它會自動修改。
package com.android.samples;
publicfinalclass R {
publicstaticfinalclassstring{
publicstaticfinalint greeting=0x0204000e;
publicstaticfinalint start_button_text=0x02040001;
publicstaticfinalint submit_button_text=0x02040008;
publicstaticfinalint main_screen_title=0x0204000a;
};
publicstaticfinalclass layout {
publicstaticfinalint start_screen=0x02070000;
publicstaticfinalint new_user_pane=0x02070001;
publicstaticfinalint select_user_list=0x02070002;
};
publicstaticfinalclass drawable {
publicstaticfinalint company_logo=0x02020005;
publicstaticfinalint smiling_cat=0x02020006;
publicstaticfinalint yellow_fade_background=0x02020007;
publicstaticfinalint stretch_button_1=0x02020008;
};
};
在代碼中使用資源
在代碼中使用資源需要知道完整的資源ID和您的資源對象類型。下面是資源引用語法:
R.resource_type.resource_name 或者 android.R.resource_type.resource_name
resource_type是R類中保存制定類型資源的子類。resource_name是定義在XML文件中的資源名或者被其他文件類型所定義的資源文件名(無擴(kuò)展名)每一類型的資源都依據(jù)其類型,被添加入某一指定的R子類;學(xué)習(xí)R子類的類型關(guān)系請參考資源引用一節(jié)。您的應(yīng)用程序引用已被編譯的資源時(shí)可以不帶包名(比如R.resource_type.resource_name)。Android包含一個(gè)標(biāo)準(zhǔn)資源的序號,比如屏幕的樣式和按鈕的背景。引用這些資源,您必須使用帶android的語法,比如android.R.drawable.button_background。
下面是一些好的和不好的代碼例子:
// Load a background for the current screen from a drawable resource.
this.getWindow().setBackgroundDrawableResource(R.drawable.my_background_image);
// WRONG Sending a string resource reference into a
// method that expects a string.
this.getWindow().setTitle(R.string.main_title);
// RIGHT Need to get the title from the Resources wrapper.
this.getWindow().setTitle(Resources.getText(R.string.main_title));
// Load a custom layout for the current screen.
setContentView(R.layout.main_screen);
// Set a slide in animation for a ViewFlipper object.
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.hyperspace_in));
// Set the text on a TextView object.
TextView msgTextView =(TextView)findViewByID(R.id.msg);
msgTextView.setText(R.string.hello_message);
引用資源
一個(gè)屬性值(或資源)同樣可以引用資源。這種用法常在資源布局器文件中用于文字和圖片(定義在其他文件中)。這種方法可以引用任何資源,包括顏色和整數(shù)。
比如,如果我們有一個(gè)顏色資源,我們可以寫一個(gè)布局器文件,在其中指定文本顏色和尺寸。
<?xml version="1.0" encoding="utf-8"?>
<EditText id="text"
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="Hello, World!" />
注意,“@”前綴聲明這是一個(gè)資源引用—隨后的文本是以@[package:]type/name形式提供的資源名。在這個(gè)例子中我們不需要指明特定的包,因?yàn)槲覀冊谖覀冏约旱陌幸谩R靡粋€(gè)系統(tǒng)文件時(shí),我們需要這樣寫:
<?xml version="1.0" encoding="utf-8"?>
<EditText id="text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:textColor="@android:color/opaque_red"
android:text="Hello, World!" />
在其他的例子中您會經(jīng)常看到使用資源引用實(shí)現(xiàn)本地化。
<?xml version="1.0" encoding="utf-8"?>
<EditText id="text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:textColor="@android:color/opaque_red"
android:text="@string/hello_world" />
這種簡便的方法可以在資源之間引用。比如,我們可以創(chuàng)建一個(gè)新的可繪制對象,一個(gè)真實(shí)存在的圖片的別名:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable id="my_background">@android:drawable/theme2_background</drawable>
</resources>
引用主題屬性
其他種類的資源可以引用當(dāng)前主題的屬性值。這些屬性只能是樣式資源或XML屬性。利用這種方法,您可以定制您的UI界面,使其與當(dāng)前主題保持風(fēng)格上的統(tǒng)一。
下面的例子展示了如何使用系統(tǒng)主題設(shè)置布局器中的文本顏色:
<?xml version="1.0" encoding="utf-8"?>
<EditText id="text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:textColor="?android:textDisabledColor"
android:text="@string/hello_world" />
注意:引用主題屬性的方法和引用資源的方法很相似,僅僅是用“?”替代了“@”。當(dāng)您使用這個(gè)標(biāo)記,你所提供的資源名必須能夠在主題屬性中找到,因?yàn)橘Y源工具認(rèn)為這個(gè)資源屬性是被期望得到的,您不需要明確的支出他的類型(?android:attr/android:textDisabledColor)。
使用系統(tǒng)資源
許多包含于系統(tǒng)之中的資源是能被應(yīng)用程序所訪問的。所有的資源被定義在android.R類中。比如,您可以使用一下代碼在屏幕上顯示標(biāo)準(zhǔn)應(yīng)用程序的ICON:
publicclassMyActivityextendsActivity
{
publicvoid onStart()
{
requestScreenFeatures(FEATURE_BADGE_IMAGE);
super.onStart();
setBadgeResource(android.R.drawable.sym_def_app_icon);
}
}
類似的,下面的代碼會更改您的系統(tǒng)主題:
publicclassMyActivityextendsActivity
{
publicvoid onStart()
{
super.onStart();
setTheme(android.R.style.Theme_Black);
}
}
為語言和配置提供可更換的資源
您可以為您的應(yīng)用程序選擇不同的UI語言和硬件配置。注意,盡管您可以使用不同的字符串,布局管理器和其他的很多資源,SDK不會暴露方法支持您顯示的指定何種資源需要被加載。Android識別整套資源的硬件和本地化屬性,而后適當(dāng)?shù)募虞d他們。用戶可以在設(shè)備的設(shè)置面板中更換語言設(shè)置。
為了包含可更換資源,創(chuàng)建平行的資源目錄,以限定的方式命名這些目錄,配置文件也同樣適用(語言、屏幕等)。下面的例子給出同時(shí)支持英語和法語的方法:
MyApp/
res/
values-en/
strings.xml
values-fr/
strings.xml
Android支持多種命名限定和多樣的值風(fēng)格。添加這些信息到資源目錄末尾,使用連接號分離。您可以為單個(gè)目錄添加多段限定。但是他們需要保持一定順序以方便閱讀和理解。下面的例子就是一個(gè)帶有限定的可繪制對象資源目錄的全名:
MyApp/
res/
drawable-en-rUS-port-160dpi-finger-keysexposed-qwerty-dpad-480x320/
更具代表性的,您可能需要指定一些資源配置參數(shù)。您也許需要除去完整列表中的一些值,但是還有很多很多值被保留在列表中:
MyApp/
res/
drawable-en-rUS-finger/
drawable-port/
drawable-port-160dpi/
drawable-qwerty/
限定詞
|
值
|
語言
|
兩字節(jié)ISO 639-1 低位的語言編碼,比如:en, fr, es
|
區(qū)域
|
兩字節(jié)ISO 3166-1-alpha-2 帶有小寫"r"前綴的大寫地區(qū)編碼。如:rUS, rFR, rES
|
屏幕方向
|
port, land, square
|
屏幕像素密度
|
92dpi, 108dpi, etc.
|
觸摸屏類型
|
notouch, stylus, finger
|
用戶是否可以使用鍵盤
|
keysexposed, keyshidden
|
默認(rèn)的文字輸入方法
|
nokeys, qwerty, 12key
|
默認(rèn)的非觸摸導(dǎo)航方法
|
notouch, dpad, trackball, wheel
|
屏幕尺寸
|
320x240, 640x480, etc. 較大的尺寸必須首先聲明。
|
次列表不包括設(shè)備定制的參數(shù),比如信號、商標(biāo)等。所有應(yīng)用程序應(yīng)該知道的信息都需要按照上面的列表信息編碼。
這里有一些命名的通用原則:
· 值之間用連接號連接
· 值是大小寫敏感的,比如
o 一個(gè)指定的drawable目錄必須命名為drawable-port,而不是drawable-PORT。
· 每種限定詞只能有一種選擇,您不能命名目錄為drawable-rEN-rFR/。
· 您可以添加多種限定詞,但是每個(gè)限定詞必須在在上面列表中。比如drawable-en-rUS-land表明其用于直板的美式英語設(shè)別上。
· 帶有限定詞的目錄不能被嵌套,比如,res/drawable/drawable-en是不允許的。
· 資源引用在語法中表示為未加修飾的表達(dá)式,比如 MyApp/res/drawable-port-92dp/myimage.png,在XML中表示為:@drawable/myimage,在代碼中表示為:R.drawable.myimage。
Android如何找到最匹配的目錄
Android將根據(jù)配置文件挑選資源,挑選過程為:
1. 排除所有和配置文件中指定的當(dāng)前設(shè)備參數(shù)不匹配的資源。比如,如果屏幕像素密度為108dpi,下面所列出的目錄中,只有MyApp/res/drawable-port-92dpi/會被排除。
MyApp/res/drawable/myimage.png
MyApp/res/drawable-en/myimage.png
MyApp/res/drawable-port/myimage.png
MyApp/res/drawable-port-92dpi/myimage.png
2. 接下來系統(tǒng)將根據(jù)限定字的多少來篩選。例如,如果您的本地系統(tǒng)識別為en-GB編碼的便攜設(shè)備,隨后我們還剩兩個(gè)目錄可以匹配。
MyApp/res/drawable/myimage.png
MyApp/res/drawable-en/myimage.png
MyApp/res/drawable-port/myimage.png
3. 選擇機(jī)制將根據(jù)配置文件中定義的優(yōu)先級,優(yōu)先級定義于上面的列表順序中。
4. MyApp/res/drawable-en/myimage.png
5. MyApp/res/drawable-port/myimage.png
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining