Android資原始檔

l_serein發表於2012-05-17

資源是您在程式碼中使用到的並且在編譯時被打包進您的應用程式的附加檔案。Android支援多種不同的檔案,包括XMLPNGJPEG檔案。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

.png9.png.jpg檔案被編譯為Drawable資源子型別:

使用Resources.getDrawable(id)可以獲得資源型別

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通道,頭兩位十六進位制數字指定透明度。0ALPHA通道中表示全透明,預設值是不透明。

使用資源

      這一節講述如何使用您所建立的資源,包括:

·         在程式碼中使用資源 如何在程式碼中使用資源。

·         如何引用其他資源中的資源 您可以從其他資源中引用資源。您可以重新使用資源內部的通用資源。

·         支援資源更替 您可以在載入時依據語言、顯示配置和主機硬體的不同指定不同的資源。

在編譯時,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_typeR類中儲存制定型別資源的子類。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 低位的語言編碼,比如:enfres

區域

兩位元組ISO 3166-1-alpha-2 帶有小寫"r"字首的大寫地區編碼。如: rUSrFRrES

螢幕方向

portlandsquare

螢幕畫素密度

92dpi108dpi, etc.

觸控式螢幕型別

notouchstylusfinger

使用者是否可以使用鍵盤

keysexposedkeyshidden

預設的文字輸入方法

nokeysqwerty12key

預設的非觸控導航方法

notouchdpadtrackballwheel

螢幕尺寸

320x240640x480, 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.              選擇機制將根據配置檔案中定義的優先順序,優先順序定義於上面的列表順序中。

4.    MyApp/res/drawable-en/myimage.png

5.    MyApp/res/drawable-port/myimage.png

相關文章