1. 程式人生 > >Android Resource介紹和使用(一)

Android Resource介紹和使用(一)

1. 相關資料夾介紹

   在Android專案資料夾裡面,主要的資原始檔是放在res資料夾裡面的。assets資料夾是存放不進行編譯加工的原生檔案,即該資料夾裡面的檔案不會像xml,java檔案被預編譯,可以存放一些圖片,html,js,css等檔案。在後面會介紹如何讀取assets資料夾的資源!    res資料夾裡面的多個資料夾的各自介紹(來自網上的Android開發指南中文版內容):

目錄Directory

資源型別Resource Types

res/drawable/

.png.9.png.jpg檔案,它們被編譯進以下的Drawable資源子型別中:

要獲得這種型別的一個資源,可以使用

Resource.getDrawable(id)

點陣圖檔案

為了獲取資源型別,使用mContext.getResources().getDrawable(R.drawable.imageId)

注意:放在這裡的影象資源可能會被aapt工具自動地進行無失真壓縮優化。比如,一個真彩色但並不需要256色的PNG可能會被轉換為一個帶調色盤的8PNG。這使得同等質量的圖片佔用更少的資源。所以我們得意識到這些放在該目錄下的二進位制影象在生成時可能會發生變化。如果你想讀取一個影象位流並轉換成一個位圖(bitmap),請把影象檔案放在res/raw/目錄下這樣可以避免被自動優化。

res/layout/

被編譯為屏幕布局(或螢幕的一部分)的XML檔案。參見佈局宣告(Declaring Layout)

res/values/

可以被編譯成很多種型別的資源的XML檔案。

注意: 不像其他的res/資料夾,它可以儲存任意數量的檔案,這些檔案儲存了要建立資源的描述,而不是資源本身。XML元素型別控制這些資源應該放在R類的什麼地方。

儘管這個資料夾裡的檔案可以任意命名,不過下面使一些比較典型的檔案(檔案命名的慣例是將元素型別包含在該名稱之中):

array.xml 定義陣列

colors.xml 定義。使用Resource.getDrawable()Resources.getColor()

分別 獲得這些資源。

dimens.xml定義。使用Resources.getDimension()獲得 這些資源。

strings.xml定義值。使用Resources.getString()或者Resources.getText()獲取 這些資源。getText()會保留在UI字元 串上應用的豐富的文字樣式。

styles.xml 定義對 象。

res/xml/

res/raw/

直接複製到裝置中的任意檔案。它們無需編譯,新增到你的應用 程式編譯產生的壓縮檔案中。要使用這些資源,可以呼叫,引數是資源的ID,即R.raw.somefilename

2.自動生成的R class

   在專案資料夾的gen資料夾裡面有個R.java,我們平常引用的資源主要引用這個類的變數。     注意:R類是自動生成的,並且它不能被手動修改。當資源發生變動時,它會自動修改。

3. 在程式碼中使用資源

下面是一個引用資源的語法: 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。 下面是官方給出的一些在程式碼中使用已編譯資源的正確和錯誤用法的例子:
  1. // Load a background for the current screen from a drawable resource.
  2. this.getWindow().setBackgroundDrawableResource(R.drawable.my_background_image); 
  3. // WRONG Sending a string resource reference into a 
  4. // method that expects a string.
  5. this.getWindow().setTitle(R.string.main_title); 
  6. // RIGHT Need to get the title from the Resources wrapper.
  7. this.getWindow().setTitle(Resources.getText(R.string.main_title)); 
  8. // Load a custom layout for the current screen.
  9. setContentView(R.layout.main_screen); 
  10. // Set a slide in animation for a ViewFlipper object.
  11. mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,  
  12.         R.anim.hyperspace_in)); 
  13. // Set the text on a TextView object.
  14. TextView msgTextView = (TextView)findViewByID(R.id.msg); 
  15. msgTextView.setText(R.string.hello_message);  
      查了SDKDoc,才明白為什麼window.setTitle要先Resources.getText,原來setTitle的引數是CharSequence,Resources.getText(int)返回的是CharSequence;而其他setText的引數有的是CharSequence,有的是int(這就是Resources變數值)。 同時官方還給了兩個使用系統資源的例子:
  1. //在螢幕上顯示標準應用程式的圖示
  2. publicclass MyActivity extends Activity { 
  3.     publicvoid onStart() { 
  4.         requestScreenFeatures(FEATURE_BADGE_IMAGE); 
  5.         super.onStart(); 
  6.         setBadgeResource(android.R.drawable.sym_def_app_icon); 
  7.     } 
  8. //應用系統定義的標準"綠色背景"視覺處理
  9. publicclass MyActivity extends Activity 
  10.     publicvoid onStart() { 
  11.         super.onStart(); 
  12.         setTheme(android.R.style.Theme_Black); 
  13.     } 

4. xml檔案內引用資源

1) 引用自定義的資源      android:text="@string/hello"      這裡使用"@"字首引入對一個資源的引用--在@[package:]type/name形式中後面的文字是資源的名稱。在這種情況下,我們不需要指定包名,因為我們引用的是我們自己包中的資源。type是xml子節點名,name是xml屬性名:
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3.     <stringname="hello">Hello World, HelloDemo!</string>
  4. </resources>
2) 引用系統資源      android:textColor="@android:color/opaque_red"  指定package: android 3) 引用主題屬性       另外一種資源值允許你引用當前主題中的屬性的值。這個屬性值只能在樣式資源和XML屬性中使用;它允許你通過將它們改變為當前主題提供的標準變化來改變UI元素的外觀,而不是提供具體的值。       android:textColor="?android:textDisabledColor"       注意,這和資源引用非常類似,除了我們使用一個"?"字首代替了"@"。當你使用這個標記時,你就提供了屬性資源的名稱,它將會在主題中被查詢--因為資源工具知道需要的屬性資源,所以你不需要顯示宣告這個型別(如果宣告,其形式就是?android:attr/android:textDisabledColor)。除了使用這個資源的識別符號來查詢主題中的值代替原始的資源,其命名語法和"@"形式一致:?[namespace:]type/name,這裡型別可選。

5.替換資源(為了可替換的資源和配置)

6. Color Value

語法:
  1. <colorname="color_name">#color_value</color>
可以儲存在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示例(宣告兩個顏色,第一個不透明,第二個透明色):
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3.     <colorname="opaque_red">#f00</color>
  4.     <colorname="translucent_red">#80ff0000</color>
  5. </resources>

    本文轉自:http://blog.sina.com.cn/s/blog_49d3ec2f01017xrg.html