2010年10月20日 星期三

Android Resources 資源檔-基本概念(一)

一.說明
在Android下會需要用到的各種資源都會放在res/目錄下,包括版面,圖片,文字字串,資料陣列,顏色...等各式實體內容都會放在這目錄下,而在res/下主要了包含以下8個目錄,分別代表8種不同類型的resource
1.anim/:XML檔案,ㄐ定義所有的tween動畫
2.color/:XML檔案,定義colors state list,也就是以一個物件的
  方式設定在各種狀態時的color變化
3.drawable/:bitmap檔案,包括(.png .9.png .jpg .gif)
4.layout/:XML檔案,定義使用者使用介面的layout
5.menu/:XML檔案,定義該App的menu,例如Options Menu, Context Menu, or Sub Menu
6.raw/:任意檔案用他原本的資料格式儲存
7.values/:包含一些簡單的值設定,如string,color,style
8.xml/:任何其他的xml檔案放在這目錄

二.作業原理
在Android將整個專案Compile時,會將所有在res/目錄下的資源都會被Compile成一個R Class,而在res下的各種類型,則會成為R的subClass 如R.string R.drawable都是一個 class 。所以透過R Class可以讓你直接找到資源的resourceID,再利用resourceID來取到resource實體內容。無論資料內容是任何類型的資料,resourceID都只是個int值,而非實體資料內容,要取得實體內容,都需要依照要取得的resource類型,透過resourceID來取得
例如
在res/values/strings.xml內有一筆
 <string name='hello'>測試</string>  
因此R.string.hello即是這筆資料的resourceID,透過getString()才能取得真正的內容
String string = getString(R.string.hello);

三.R下SubClass
R下面的subclass,並非由各目錄的名稱或xml檔案名稱所訂,而是對應到資料類型。譬如說R.string這個次類別,string是來自於strings.xml內有tag,至於這tag所依附的xml檔名,是可以任意的設定(並非一定要設成strings.xml)
也可以把不同類型的資料放到同一個xml檔案內,只是通常會把相同資源放在同一個xml檔案內,方便管理

四.res下更多的衍生類別目錄
除了標準的八種類型目錄外,在res下可以看到更多的其他衍生出來的目錄。
譬如說有layout/ 也可看到layout-land/目錄,這些衍生出來的目錄,都是因應可以讓你開發的應用程式,可以因偵測到使用者device的條件不同,而提供有不同的使用介面與設定,包括解析度尺寸不同,或多語系,都可設定各自的顯視介面,這些目錄名稱的命名都是有規則的,在規則性的命名下,Android系統即會自動判斷要取用哪個目錄下的資源,來顯示在使用者的Device上

例如
在res/下除了有一個 layout/目錄提供標準的版面給使用者外,另外還有一個layout-land/目錄提供給橫向螢幕使用,也就是說當使用者以直式使用時,畫面上是以layout/目錄下的設定來顯示,當使用者把device轉向成橫式時,就會自動切換到以layout-land/目錄下的設定顯示

五.res衍生目錄命名規則
目錄名稱命名方式為resources_name-config_qualifier
resources_name:即原來資源類型的名稱,如string,color,array,...
config_qualifier:依照各類型資源各有不同的值可用
例如:
以Screen orientation螢幕方向來分,config_qualifier允許的值為port直,land橫
res/layout:一般標準layout
res/layout-land:針對橫向時用的layout

幾個常見的config_qualifier包括

1.Language:用來儲存依照不同語系地區所提供的resource
  例 值:en ,fr,tw,cn
  產生的目錄會是
  values-tw/
2.Screen size:螢幕解析度
  值:small,normal,large
3.Wider/taller screens:螢幕形狀,長形或一般
  值:long,notlong
4.Screen orientation:螢幕是直式或橫式
  值:port直,land橫
5.Dock mode:一般或車上模式 
可以用多個config_qualifier串接如 drawable-port-hdpi/,但順序需依照規格書內列表的順序描述

六.res衍生目錄需要用到重複資源的處理方式
當有一份resource(例如圖檔),要給多種設定檔使用,可以不用copy到每個folder各有一份,只需要建立Alias即可,並非所有resource都可提供Alias機制,如animation, menu, raw, 與其他在xml/ 目錄下的都不行
1.drawable 圖檔
例:如果有一張圖檔icon.png原本放在drawable目錄下,要給多個設定檔使用
但又不希望直接copy檔案到各目錄

1.將icon.png rename為 icon_oz.png(只要不是原檔名就好)
將檔案放到drawable/目錄下
2.產生一個icon.xml檔案
 <?xml version="1.0" encoding="utf-8"?>  
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"  
      android:src="@drawable/icon_oz" />  
放到各drawable-xxx/目錄下
3.使用上用
R.drawable.icon可取得
2.layout
例:有一份layout要提供多個設定檔使用
1.將原layout main.xml 改名為main_oz.xml
放到res/layout/
2.產生一個main.xml
 <?xml version="1.0" encoding="utf-8"?>  
 <merge>  
      <include layout="@layout/main_oz"/>  
 </merge>  
放到各目錄下
3.使用上
R.layout.main
3.string或其他
在要alias的項目填上對應資料即可
 <?xml version="1.0" encoding="utf-8"?>  
 <resources>  
      <string name="hello">Hello</string>  
      <string name="hi">@string/hello</string>  
 </resources>  

沒有留言: