Android資源文件

 

Android資源文件

關鍵字: android資源文件

Android資源文件

    資源是您在代碼中使用到的並且在編譯時被打包進您的應用程序的附加文件。Android支持多種不同的文件,包括XML、PNG和JPEG文件。XML文件的格式決定於其描述的內容。這些文件將描述文件支持的類型、語法或格式。

處於加載效率的考慮,資源被從代碼中分離出來,而且XML文件被編譯進二進制代碼中。字符串,類似的會被壓縮存儲爲更經濟的格式。處於這樣或那樣的原因,Android平臺中會存在很多不同的資源和資源定義文件。

這些文件包括以下部分:

    * 資源

         o    創建資源

         o    使用資源

              §  在代碼中使用資源

              §  引用資源

              §  引用主體屬性

              §  使用系統屬性

         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)可以獲得資源類型

    * 位圖文件
    * 9-patchs(可變位圖文件)

 res/layout  資源編譯爲屏幕布局器。參見“佈局器”一章
 res/values

 XML 文件可以被編譯爲多種資源

注意:不像其他res下的目錄,這個目錄可以包含多個資源描述文件。XML文件元素類型控制着這些資源被R類放置在何處。

這些文件可以自定義名稱。這裏有一些約定俗成的文件。

    * arrays.xml 定義數組。
    * colors.xml 定義可繪製對象的顏色和字符串的顏色。使用Resources.getDrawable()和Resources.getColor()都可以獲得這些資源。
    * dimens.xml 定義尺度。使用Resources.getDimension()可以獲得這些資源
    * strings.xml 定義字符串(使用Resources.getString()或者更適合的Resources.getText()方法獲得這些資源。 Resources.getText()方法將保留所有用於描述用戶界面樣式的描述符,保持複雜文本的原貌。
    * styles.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);

引用資源

一個屬性值(或資源)同樣可以引用資源。這種用法常在資源佈局器文件中用於文字和圖片(定義在其他文件中)。這種方法可以引用任何資源,包括顏色和整數。

比如,如果我們有一個顏色資源,我們可以寫一個佈局器文件,在其中指定文本顏色和尺寸。

<?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!" />

注意,“@”前綴聲明這是一個資源引用—隨後的文本是以@[package:]type/name形式提供的資源名。在這個例子中我們不需要指明特定的包,因爲我們在我們自己的包中引用。引用一個系統文件時,我們需要這樣寫:

<?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!" />

在其他的例子中您會經常看到使用資源引用實現本地化。

<?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" />

這種簡便的方法可以在資源之間引用。比如,我們可以創建一個新的可繪製對象,一個真實存在的圖片的別名:

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <drawable id="my_background">@android:drawable/theme2_background</drawable>

</resources>
引用主題屬性

其他種類的資源可以引用當前主題的屬性值。這些屬性只能是樣式資源或XML屬性。利用這種方法,您可以定製您的UI界面,使其與當前主題保持風格上的統一。

下面的例子展示瞭如何使用系統主題設置佈局器中的文本顏色:

<?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" />

注意:引用主題屬性的方法和引用資源的方法很相似,僅僅是用“?”替代了 “@”。當您使用這個標記,你所提供的資源名必須能夠在主題屬性中找到,因爲資源工具認爲這個資源屬性是被期望得到的,您不需要明確的支出他的類型 (?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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章