資源是您在代碼中使用到的而且在編譯時被打包進您的應用程序的附加文件。Android支持多種不一樣的文件,包括XML、PNG和JPEG文件。XML文件的格式決定於其描述的內容。這些文件將描述文件支持的類型、語法或格式。android
處於加載效率的考慮,資源被從代碼中分離出來,並且XML文件被編譯進二進制代碼中。字符串,相似的會被壓縮存儲爲更經濟的格式。處於這樣或那樣的緣由,Android平臺中會存在不少不一樣的資源和資源定義文件。web
這些文件包括如下部分:數組
* 資源app
o 建立資源ide
o 使用資源工具
§ 在代碼中使用資源佈局
§ 引用資源學習
§ 引用主體屬性動畫
§ 使用系統屬性this
o 更改資源
o 資源引用
o 術語表
* 國際化(l18N)
配合資源引用文檔,Android提供了一套經濟的資源處理技術。他轉化了大量的資源信息,使Android在運行時無需瞭解文檔的內容,僅僅在您須要的時候指導他在哪兒就能夠了。
資源
這一節包含了與資源有關聯的術語表和一系列使用資源的代碼事例。更完整的Android資源指南請參看「資源」一章。
Android資源系統保存全部與代碼無關資源的存根。您可使用Resources類訪問您應用程序的資源;與應用程序相關聯的資源實例能夠經過Context.getResources()獲得。
一個應用程序的資源能夠被構建系統在構建時編譯進二進制的應用程序裏。爲了使用資源,您須要正確的初始化您應用程序中的資源樹而且構建您的應用程序。在構建過程的部分,每一個資源的標識被產生,您能夠在代碼中使用他們。這些標識容許編譯器校驗您應用程序中的代碼和資源定義是否匹配。
有關本章的其餘細節請參見教程如何使用資源的部分。
建立資源
Android支持字符串,位圖和許多其餘類型的資源。每一種資源定義文件的語法和格式及保存的位置取決於其依賴的對象。一般,您能夠經過三種文件建立資源:XML文件(除位圖和原生文件外),位圖文件(做爲圖片)和原生文件(全部其餘的類型,好比聲音文件)。事實上,這裏有兩種不一樣類型的XML文件,一種是做爲資源被編譯近應用程序,另外一種怎是資源的描述,被aapt使用。下面的表格詳細說明了這些XML文件的類型和結構。
您能夠在您項目res/目錄下的適當子目錄下建立和存儲資源文件。Android使用資源編譯器訪問資源所在的子目錄和格式化的文件。下面的表格列出了每一種資源的文件類型。參見「資源引用」一節能夠了解關於對象、語法和格式方面的內容。
目錄 | 資源類型 |
res/anim | XML文件編譯爲楨序列動畫或者自動動畫對象。 |
res/drawable | .png,9.png,.jpg文件被編譯爲Drawable資源子類型: 使用Resources.getDrawable(id)能夠得到資源類型 * 位圖文件 |
res/layout | 資源編譯爲屏幕布局器。參見「佈局器」一章 |
res/values | XML 文件能夠被編譯爲多種資源 注意:不像其餘res下的目錄,這個目錄能夠包含多個資源描述文件。XML文件元素類型控制着這些資源被R類放置在何處。 這些文件能夠自定義名稱。這裏有一些約定俗成的文件。 * arrays.xml 定義數組。 |
res/xml | 自定義的XML文件。這些文件將在運行時編譯近應用程序,而且使用Resources.getXML()方法能夠在運行時獲取。 |
res/raw | 自定義的原生資源,將被直接拷貝入設備。這些文件將不被壓縮近您的應用程序。使用帶有ID參數的Resources.getRawResource()方法能夠得到這些資源,好比R.raw.somefilename。 |
資源被最終編譯近APK文件。Android建立包裝類R,您能夠用他找回資源。R包含一些與資源所在目錄同名的子類。
全局資源
* 不少資源都容許您定義顏色。Android接受web風格的顏色定義-一組十六進制的顏色值,按照如下序列排列:#RGB,#ARGB,#RRGGBB,#AARRGGBB。
* 全部的顏色都支持ALPHA通道,頭兩位十六進制數字指定透明度。0在ALPHA通道中表示全透明,默認值是不透明。
使用資源
這一節講述如何使用您所建立的資源,包括:
· 在代碼中使用資源 如何在代碼中使用資源。
· 如何引用其餘資源中的資源 您能夠從其餘資源中引用資源。您能夠從新使用資源內部的通用資源。
· 支持資源更替 您能夠在加載時依據語言、顯示配置和主機硬件的不一樣指定不一樣的資源。
在編譯時,Android生成名爲R的類。R包含您應用程序所用到的全部的類。這個類包含一些與res下子目錄同名的子類。這些子類包含每個您在資源文件中定義的資源的標識。這些資源標識能夠在您的代碼中引用。這裏有一段簡單的資源文件,包含一些文字,佈局器和圖片資源。
注意:R類是自動生成的,而且它不能被手動修改。當資源發生變更時,它會自動修改。
package com.android.samples;
public final class R {
public static final class string {
public static final int greeting=0x0204000e;
public static final int start_button_text=0x02040001;
public static final int submit_button_text=0x02040008;
public static final int main_screen_title=0x0204000a;
};
public static final class layout {
public static final int start_screen=0x02070000;
public static final int new_user_pane=0x02070001;
public static final int select_user_list=0x02070002;
};
public static final class drawable {
public static final int company_logo=0x02020005;
public static final int smiling_cat=0x02020006;
public static final int yellow_fade_background=0x02020007;
public static final int stretch_button_1=0x02020008;
};
};
在代碼中使用資源
在代碼中使用資源須要知道完整的資源ID和您的資源對象類型。下面是資源引用語法:
R.resource_type.resource_name 或者 android.R.resource_type.resource_name
resource_type是R類中保存制定類型資源的子類。resource_name是定義在XML文件中的資源名或者被其餘文件類型所定義的資源文件名(無擴展名)每一類型的資源都依據其類型,被添加入某一指定的R子類;學習R子類的類型關係請參考資源引用一節。您的應用程序引用已被編譯的資源時能夠不帶包名(好比R.resource_type.resource_name)。Android包含一個標準資源的序號,好比屏幕的樣式和按鈕的背景。引用這些資源,您必須使用帶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);
引用資源
一個屬性值(或資源)一樣能夠引用資源。這種用法常在資源佈局器文件中用於文字和圖片(定義在其餘文件中)。這種方法能夠引用任何資源,包括顏色和整數。
好比,若是咱們有一個顏色資源,咱們能夠寫一個佈局器文件,在其中指定文本顏色和尺寸。
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!" />
注意,「@」前綴聲明這是一個資源引用—隨後的文本是以@[package:]type/name形式提供的資源名。在這個例子中咱們不須要指明特定的包,由於咱們在咱們本身的包中引用。引用一個系統文件時,咱們須要這樣寫:
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!" />
在其餘的例子中您會常常看到使用資源引用實現本地化。
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" />
這種簡便的方法能夠在資源之間引用。好比,咱們能夠建立一個新的可繪製對象,一個真實存在的圖片的別名:
引用主題屬性
其餘種類的資源能夠引用當前主題的屬性值。這些屬性只能是樣式資源或XML屬性。利用這種方法,您能夠定製您的UI界面,使其與當前主題保持風格上的統一。
下面的例子展現瞭如何使用系統主題設置佈局器中的文本顏色:
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" />
注意:引用主題屬性的方法和引用資源的方法很類似,僅僅是用「?」替代了「@」。當您使用這個標記,你所提供的資源名必須可以在主題屬性中找到,由於資源工具認爲這個資源屬性是被指望獲得的,您不須要明確的支出他的類型(?android:attr/android:textDisabledColor)。
使用系統資源
許多包含於系統之中的資源是能被應用程序所訪問的。全部的資源被定義在android.R類中。好比,您可使用一下代碼在屏幕上顯示標準應用程序的ICON:
public class MyActivity extends Activity
{
public void onStart()
{
requestScreenFeatures(FEATURE_BADGE_IMAGE);
super.onStart();
setBadgeResource(android.R.drawable.sym_def_app_icon);
}
}
相似的,下面的代碼會更改您的系統主題:
public class MyActivity extends Activity
{
public void onStart()
{
super.onStart();
setTheme(android.R.style.Theme_Black);
}
}
爲語言和配置提供可更換的資源
您能夠爲您的應用程序選擇不一樣的UI語言和硬件配置。注意,儘管您可使用不一樣的字符串,佈局管理器和其餘的不少資源,SDK不會暴露方法支持您顯示的指定何種資源須要被加載。Android識別整套資源的硬件和本地化屬性,然後適當的加載他們。用戶能夠在設備的設置面板中更換語言設置。
爲了包含可更換資源,建立平行的資源目錄,以限定的方式命名這些目錄,配置文件也一樣適用(語言、屏幕等)。下面的例子給出同時支持英語和法語的方法:
MyApp/
res/
values-en/
strings.xml
values-fr/
strings.xml
Android支持多種命名限定和多樣的值風格。添加這些信息到資源目錄末尾,使用鏈接號分離。您能夠爲單個目錄添加多段限定。可是他們須要保持必定順序以方便閱讀和理解。下面的例子就是一個帶有限定的可繪製對象資源目錄的全名:
MyApp/
res/
drawable-en-rUS-port-160dpi-finger-keysexposed-qwerty-dpad-480x320/
更具表明性的,您可能須要指定一些資源配置參數。您也許須要除去完整列表中的一些值,可是還有不少不少值被保留在列表中:
MyApp/
res/
drawable-en-rUS-finger/
drawable-port/
drawable-port-160dpi/
drawable-qwerty/
限定詞 | 值 |
語言 | 兩字節ISO 639-1 低位的語言編碼,好比:en, fr, es |
區域 | 兩字節ISO 3166-1-alpha-2 帶有小寫"r"前綴的大寫地區編碼。如: rUS, rFR, rES |
屏幕方向 | port, land, square |
屏幕像素密度 | 92dpi, 108dpi, etc. |
觸摸屏類型 | notouch, stylus, finger |
用戶是否可使用鍵盤 | keysexposed, keyshidden |
默認的文字輸入方法 | nokeys, qwerty, 12key |
默認的非觸摸導航方法 | notouch, dpad, trackball, wheel |
屏幕尺寸 | 320x240, 640x480, etc. 較大的尺寸必須首先聲明。 |
次列表不包括設備定製的參數,好比信號、商標等。全部應用程序應該知道的信息都須要按照上面的列表信息編碼。
這裏有一些命名的通用原則:
· 值之間用鏈接號鏈接
· 值是大小寫敏感的,好比
o 一個指定的drawable目錄必須命名爲drawable-port,而不是drawable-PORT。
· 每種限定詞只能有一種選擇,您不能命名目錄爲drawable-rEN-rFR/。
· 您能夠添加多種限定詞,可是每一個限定詞必須在在上面列表中。好比drawable-en-rUS-land代表其用於直板的美式英語設別上。
· 帶有限定詞的目錄不能被嵌套,好比,res/drawable/drawable-en是不容許的。
· 資源引用在語法中表示爲未加修飾的表達式,好比 MyApp/res/drawable-port-92dp/myimage.png,在XML中表示爲:@drawable/myimage,在代碼中表示爲:R.drawable.myimage。
Android如何找到最匹配的目錄
Android將根據配置文件挑選資源,挑選過程爲:
1. 排除全部和配置文件中指定的當前設備參數不匹配的資源。好比,若是屏幕像素密度爲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. 接下來系統將根據限定字的多少來篩選。例如,若是您的本地系統識別爲en-GB編碼的便攜設備,隨後咱們還剩兩個目錄能夠匹配。
MyApp/res/drawable/myimage.png
MyApp/res/drawable-en/myimage.png
MyApp/res/drawable-port/myimage.png
3. 選擇機制將根據配置文件中定義的優先級,優先級定義於上面的列表順序中。
MyApp/res/drawable-en/myimage.png
MyApp/res/drawable-port/myimage.png
來源:http://blog.163.com/zhao_tian_yu/blog/static/59511536200912010501573/