1. 程式人生 > >Android資原始檔詳解

Android資原始檔詳解

之前在介紹專案目錄結構時說到過Android程式的資原始檔,Android軟體是如何管理自己的資原始檔的呢? 首先資原始檔有那些型別,分為/res資料夾下預編譯的和/assets原生的檔案。 在res資料夾中會放些什麼東西呢? /anim資料夾放置XML檔案的動畫檔案(它們會被編譯成逐幀動畫(frame by frame animation)或補間動畫 (tweened animation) 物件),這個暫時還接觸,不清楚。 /drawable資料夾下放置圖片資原始檔(png,jpg ,gif),可以通過Id獲得對應資源圖片Drawable物件。 類似的還有/raw資料夾下,放置了會直接複製到裝置中的任意檔案。它們無需編譯,新增到你的應用程式編譯產生的壓縮檔案中,可以通過
getRawResource()方法獲取。 /values資料夾下是可以被編譯成很多種型別的資源的XML檔案,儲存著一些常量。 通過/values-xxx的字尾設定,可以進行不同國家語言本地化設定,比如簡體中文放在/values-zh-rCN下 這個資料夾下的xml檔名可以自己設定,但有一些比較典型的檔案:
array.xml 定義陣列  colors.xml 定義color drawable和顏色的字串值(color string values)  dimens.xml 定義尺寸值(dimension value) strings.xml 定義字串(string)值 styles.xml 定義樣式(style)物件
/xml資料夾當然下也是xml檔案,但是是需要用getXML()即時讀使用的資訊值。 /menu選單檔案,xmlAndroid 中的選單分為選項選單、上下文選單和子選單,都可以在 XML檔案中宣告定義。通過R.menu.my_men 的方式來引用。典型選單資原始檔的結構:<menu> 根元素,在根元素裡會巢狀 <item> 和 <group> 子元素,<item> 元素中也可巢狀 <menu> 形成子選單。 /layout資料夾下放置的是屏幕布局資原始檔(xml格式),,關於佈局內容較多,接下來會具體介紹。 而在和/res資料夾同級的/
assets資料夾下也可以存放資原始檔但是這些資原始檔是不進行編譯加工的原生檔案,沒有標記好的資源id,使用時用AssetManager 以位元組流的形式讀取檔案。 1. 先在 Activity 裡面呼叫 getAssets() 來獲取 AssetManager 引用。 2. 再用 AssetManager 的 open(String fileName, int accessMode) 方法則指定讀取的檔案以及訪問模式就能得到輸入流 InputStream。 3. 然後就是用已經 open file 的 inputStream 讀取檔案,讀取完成後記得 inputStream.close()。 4. 呼叫 AssetManager.close() 關閉 AssetManager。

所以關鍵來了,/res資料夾下的資原始檔最特別的就在於通過預編譯自動生成的R類擁有標記好的id,通過id即可獲取對應資源。在曾經的eclipse專案中還可以看到這個R類,但由於這個R類並不需要我們手動設定所以在Android-Studio工程目錄種並未顯示出來。


Android資源系統儲存所有與程式碼無關資源的存根。可以使用Resources 訪問應用程式的資源;與應用程式相關聯的資源例項可以通過Context.getResources()得到。 一個應用程式的資源可以被構建系統在構建時編譯進二進位制的應用程式裡。在構建過程的部分,每個資源的標識被產生,可以在程式碼中使用。這些標識允許編譯器校驗您應用程式中的程式碼和資源定義是否匹配。 在程式碼中引用資源 R.資源型別.資源名稱 寫出對應資源的R.resource_type.resource_name 或者 android.R.resource_type.resource_name即可, 其中resource_type是 R 的子類,儲存資源的一個特定型別 resource_name 是在XML檔案定義的資源的name屬性,或者有其他檔案型別為資源定義的檔名(不包含副檔名,這指的是drawable資料夾裡面的icon.png類似的檔案,name=icon)Android 包含了很多標準資源,如螢幕樣式和按鈕背景。要在程式碼中引用這些資源,你必須使用 android進行限定,如android.R.drawable.button_background。  也可以用context.getResoures()獲取到Resources物件來獲取資源 xml檔案內引用資源 @[包名稱:]資源型別/資源名稱 1) 引用自定義的資源 android:text="@string/hello" 這裡使用 "@" 字首引入對一個資源的引用 在 @[package:]type/name形式中後面的文字是資源的名稱。在這種情況下,我們不需要指定包 名,因為我們引用的是我們自己包中的資源。type xml子節點名,name是xml屬性名:Hello World, HelloDemo! 2) 引用系統資源android:textColor="@android :color/opaque_red"指定package:android 3) 引用主題屬性 另外一種資源值允許你引用當前主題中的屬性的值。這個屬性值只能在樣式資源和XML屬性中使用;它允許你通過將它們改變為當前主題提供的標準變化來改變UI元素的外觀,而不是提供具體的值。android:textColor="?android:textDisabledColor"注意,這和資源引用非常類似,除了我們使用一個"?"字首代替了"@"。當你使用這個標記時,你就提供了屬性資源的名稱,它將會在主題中被查詢 -- 因為資源工具知道需要的屬性資源,所以你不需要顯示宣告這個型別(如果宣告,其形式就 是?android:attr/android:textDisabledColor)。除了使用這個資源的識別符號來查詢主題中的值代替原始的資源,其命名語法和 "@"形式一致:?[namespace:]type/name,這裡型別可選。  具體如下: ColorValue語法:#color_value 儲存在 res/values/colors.xml (檔名可以任意)。 xml引用:android:textColor="@color/color_name" Java 引用: int color = Resources.getColor(R.color.color_name) 其中 #color_value 有以下格式(A 代表 Alpha 通道): #RGB #ARGB #RRGGBB #AARRGGBB xml 示例 (宣告兩個顏色,第一個不透明,第二個透明色):#f00 #80ff0000 ColorDrawables語法: color_value 儲存在 res/values/colors.xml。 xml 引用:android:background="@drawable/color_name" java 引用:Drawable redDrawable = Resources.getDrawable(R.drawable.color_name) color_name 和上面的一樣。 res/drawable下的圖片(官方提示 png (preferred), jpg (acceptable), gif (discouraged),使用png格式比較好 xml引用 @[package:]drawable/some_file java引用 R.drawable.some_file 引用是不帶副檔名 dimension語法:dimen_value單位,儲存為res/values/dimen.xml。  (度量單位: px:pixel,螢幕實際的象素,電子螢幕上組成一幅圖畫或照片的最基本單元,常說的解析度 1024*768pixels,就是橫向1024px, 縱向768px,不同裝置顯示效果相同。 pt: point,點,幕的物理尺寸,印刷行業常用單位,等於 1/72 英寸 in(英寸): 螢幕的物理尺寸, 每英寸等於 2.54 釐米。 
mm(毫米): 螢幕的物理尺寸。
ppi: pixel per inch,每英寸畫素數,該值越高,則螢幕越細膩 dpi: dot per inch,每英寸多少點,該值越高,則圖片越細膩 dp: dip,Density-independent pixel,與密度無關的象素,一種基於螢幕密度的抽象單位。 是安卓開發用的長度單位,1dp 表示在螢幕畫素點密度為 160ppi 時 1px 長度,也就是在每英寸160點的顯示器上,1dp=1px。 sp: scale-independent pixel,與刻度無關的象素,安卓開發用的字型大小單位best for textsize XML: android:textSize="@dimen/some_name" Java: float dimen = Resources.getDimen(R.dimen.some_name) 其他型別資源(strings,values等等)都類似。