Android關鍵資源詳解

     Android層次結構中,資源扮演着重要的角色,資源是綁定到可執行程序的文件(例如音樂文件)或值(例如對話框標題)。經常使用的資源實例包括字符串、顏色、佈局文件等。例如不須要將字符串硬編碼到應用程序中,能夠使用它們的ID,這種間接性使你無須要改變源代碼就可以更改字符串資源的文本。

        Android中主要經過兩種文件類型來支持資源:XML文件和原始文件(包括圖像、音頻和視頻)。甚至在XML文件內部有時也能看到資源被定義爲XML文件內部的值(如字符串),有時XML文件總體就是一個資源(如佈局資源)。

        XML文件集中的另外一個特徵是能夠找到兩種文件類型:一種編譯爲二進制文件,另外一種按照原樣複製到設備。像字符串資源、位圖資源等都是編譯爲二進制文件,而後再包含到可安裝的包中,這些XML文件具備特定的格式,其中XML節點被轉換爲ID。若是將文件放到/res/raw/目錄下,它們將不會編譯爲二進制格式,必須使用明確的流式傳入的API來讀取這些文件號,如音頻和視頻文件。

       Android經常使用的關鍵資源:

      1)字符串資源

       Android中運行在一個或多個XML資源文件中定義多個字符串,這些包含字符串定義的XML文件位於/res/values子目錄下,XML文件的名稱能夠任意指定,常見爲strings.xml。以下所示:

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
        <string name="app_name">第一個Android應用</string> 
        <string name="action_settings">Settings</string> 
        <string name="hello_world">Hello world!</string> 
    </resources> 

當建立或更新文件時Eclipse的ADT插件將根據這兩個字符串爲他們建立惟一的資源ID,在應用程序的根包R.java中,自動建立一個Java類。以下所示:

    public static final class R { 
            public static final class string { 
            public static final int action_settings=0x7f050001; 
            public static final int app_name=0x7f050000; 
            public static final int hello_world=0x7f050002; 
        } 
            .... 
    } 

注意R.java在根包中定義了一個頂級類:public static final class R,這這個外部類R中Android定義了一個內部類:public static final class string,R.java將此內部靜態類建立爲一個命名空間,以保持字符串資源ID。這樣咱們在代碼中就能夠經過這個字符串ID來引用字符串:R.string.hello_world 。

        Android還支持子XML元素,例如<b>、<i>、<string>節點下其餘簡單的文本格式HTML,在文本視圖繪製以前能夠使用這種複合HTML字符串來設置文本樣式。



      2)字符串數組資源

        能夠指定一個字符串數組做爲/res/values子目錄下全部文件中的資源,咱們將使用一個名爲string-array的XML節點,此節點是resources的子節點。以下所示:

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
        <string-array name="test_array"> 
            <item>one</item> 
            <item>two</item> 
            <item>three</item> 
            <item>four</item> 
        </string-array> 
        .... 
    </resources> 

        這樣咱們能夠應用程序中經過:String strings[] = this.getResources().getStringArray(R.array.test_array)來訪問它們。


        3)顏色資源

        與字符串資源同樣,也能夠使用引用標識符來間接引用顏色,這樣Android可以本地化顏色。在資源文件colors.xml中定義了顏色後,就能夠在Java代碼中經過他們的ID來訪問它們了。除此以外Android還在本身的資源文件中定義了一組基本顏色,這些ID也可經過Android的android.R.color命名控件訪問。以下所示:

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
        <color name="red">#f00</color> 
        <color name="blue">#0000ff</color> 
        <color name="green">#f0f0</color> 
    </resources> 

在Java代碼中訪問:int mainBlackGroundColor = this.getResources().getColor(R.color.red);

        在視圖定義中使用顏色:<TextView android:id="@+id/textView"  android:textColor = "@color/red" />



      4)尺寸資源

        像素、英寸和磅值等都是能夠在XML佈局或Java代碼中使用的尺寸,能夠使用這些尺寸資源來本地化Android UI和設置它的樣式,無需更改源碼,能夠採用如下單位來指定尺寸:

       px      像素

       in       英寸

       mm   毫米

       pt      磅

       dp     與密度無關的像素基於160dpi屏幕

       sp     與比例無關的像素,支持用於調整大小,適合在字體中使用

        這些資源ID在R.demen.*中,文件中的XML節點爲/resources/demen。以下所示:

    <resource> 
            <demen name="mysize_in_pixels">2px</demen> 
            <demen name="mysize_in_dp">5dp</demen> 
            <demen name="medium_size">100sp</demen> 
    </resource>                 

在Java代碼使用尺寸資源: float dimen = this.getResources().getDimension(R.dimen.mysize_in_pixels);

        在清單文件中使用尺寸資源:android:textSize="@dimen/mediaum_size"



       5)圖像資源

      Android會爲/res/drawable子目錄下的圖像文件生成資源ID,支持的圖像格式包括:git、jpg和png。此目錄中的每一個圖像文件會根據其基本文件名生成一個惟一的ID。例如文件sample_image.jpg則生成的資源ID爲R.drawable.sample_image。

        能夠在XML視圖定義中直接引用/res/drawable下的圖像:android:background="@drawable/sample_image"

        也能夠在Java代碼中獲取圖像:

      BitmapDrawable d = this.getResources().getDrawable(R.drawable.sample_image);

      button.setBackgroundDrawanle( d );



      6)佈局資源

        在Android中,屏幕的視圖一般以資源的形式從XML文件中加載,這些XML文件稱爲佈局資源。佈局資源是Android的UI編程中使用最重要的一種資源。咱們在/res/layout下新建一個main.xml佈局資源文件時,自動會在R.layout中生成一個R.layout.main的ID來標示這個佈局資源。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:paddingBottom="@dimen/activity_vertical_margin" 
        android:paddingLeft="@dimen/activity_horizontal_margin" 
        android:paddingRight="@dimen/activity_horizontal_margin" 
        android:paddingTop="@dimen/activity_vertical_margin" 
        tools:context=".MainActivity" > 
     
        <TextView 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:text="@string/hello_world" /> 
     
    </RelativeLayout> 

        在代碼中咱們能夠使用佈局文件:

    public class MainActivity extends Activity {         
             
    @Override 
            protected void onCreate(Bundle savedInstanceState) { 
                    super.onCreate(savedInstanceState); 
                    setContentView(R.layout.activity_main); 
                    TextView textView = (TextView)this.findViewById(R.id.textView); 
            } 
    } 



7)其餘XML文件

        Android還容許將任意XML文件用做資源,此方法使用資源的優點延伸到了任意XML文件,首先它提供了一種快速方式來根據所生成的資源ID引用這些文件,其次該方法容許本地化這些資源XML文件。

        須要以此方式讀取的XML文件存儲在/res/xml子目錄下,如圖所示:

    <root> 
            <sub> 
                    Hello world from an sub element 
            </sub> 
    </root> 

        就像處理其餘Android XML資源文件同樣,Android將編譯此XML文件,而後將其放入應用程序包中,若是須要解析這些文件,須要使用一個XmlPullParser實例。    代碼清單給出瞭解析test.xml的具體實例:

    private String getEventsFromXmlFile(Activity activity) { 
            StringBuffer sb = new StringBuffer(); 
            XmlResourceParser xpp = activity.getResources().getXml(R.xml.test); 
            int eventType = xpp.next().getEventType(); 
            while(eventType != XmlParser.END_DOCUMENT) { 
                    if(eventType == XmlPullParser.START_DOCUMENT) { 
                            sb.append("Start document"); 
                    } else if(eventType == XmlPullParser.START_TAG) { 
                            sb.append("Start tag"+xpp.getName()); 
                    } else if(eventType == XmlPullParser.ENG_TAG) { 
                            sb.append("end tag" + xpp.getName()); 
                    } else if(eventType == XmlPullParser.TEXT) { 
                            sb.append("Text:"+ xpp.getText()); 
                    } 
                    eventType = xpp.next().getEventType(); 
            } 
            sb.append("End document"); 
            return sb.toString(); 
    } 



8)原始資源

        除了支持任意XML文件以外Android還支持使用原始文件,這些原始文件位於/res/raw下,包括音頻、視頻或文本文件等須要本地化或須要經過資源ID引用的原始文件資源。與/res/xml下的XML文件不一樣,這些都文件沒有貶義,而是按照原樣轉移到應用程序包中,可是每一個文件在R.java中都會生成一個標識符。

        代碼清單給出了一個解析/res/raw/下的test.txt文本文件的實例:

    String getStringFromRawFile(Activity activity) { 
            InputStream is = activity.getResources().openRawResource(R.raw.test); 
            String myText = convertStreamToString(is); 
            is.close(); 
            return myText; 
    }         
     
    String convertStreamToString(InputStream is) { 
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
            int num = is.read(); 
             while( num != -1 ) { 
                    baos.write(num); 
                    num = is.read(); 
             } 
             return baos.toString(); 
    } 



        9)原始資產

        Android提供了一個/assets目錄,能夠將要包含在包中的文件放在這裏,這個目錄與/src具備相同的級別,也就是說它未包含在/res目錄中,/asset中的文件不會在R.java中生成資源ID,必須制定文件路徑才能讀取它們。文件路徑是以/asset開頭的絕對路徑,能夠使用AssetManager類訪問這些文件:

    String getStringFromAssetFile(Activity activity) { 
            AssetManager am = activity.getAssets(); 
            InputStream is = am.open("test.txt"); 
            String s = convertStreamToString(is); 
            is.close(); 
            reutn s; 
    } 

原文做者:showyou
原文連接:http://forum.cubietech.com/forum ... &extra=page%3D1php

相關文章
相關標籤/搜索