Android關鍵資源詳解

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;
}

發佈了44 篇原創文章 · 獲贊 12 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章