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);  
       查了SDK Doc,才明白為什麼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>

7.Color Drawables

語法:
  1. <drawablename="color_name">color_value</drawable>
可以儲存在res/values/colors.xml。 xml引用:android:background="@drawable/color_name" java引用:Drawable redDrawable = Resources.getDrawable(R.drawable.color_name) color_name和上面的一樣。個人認為,一般情況下使用color屬性,當需要用到paintDrawable時才使用drawable屬性。 xml示例:
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3.     <drawablename="opaque_red">#f00</drawable>
  4.     <drawablename="translucent_red">#80ff0000</drawable>
  5. </resources>

8. 圖片

      一般放在res/drawable/裡面。官方提示png (preferred), jpg (acceptable), gif (discouraged),看來一般使用png格式比較好! xml引用  @[package:]drawable/some_file java引用 R.drawable.some_file     引用是不帶副檔名

9. dimension

語法:
  1. <dimenname="dimen_name">dimen_value單位</dimen>
一般儲存為res/values/dimen.xml。 度量單位: px(象素): 螢幕實際的象素,常說的解析度1024*768pixels,就是橫向1024px, 縱向768px,不同裝置顯示效果相同。 in(英寸): 螢幕的物理尺寸, 每英寸等於2.54釐米。 mm(毫米): 螢幕的物理尺寸。 pt(點)  : 螢幕的物理尺寸。1/72英寸。 dp/dip  : 與密度無關的象素,一種基於螢幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。但dp和px的比例會隨著螢幕密度的變化而改變,不同裝置有不同的顯示效果。 sp      : 與刻度無關的象素,主要用於字型顯示best for textsize,作為和文字相關大小單位。 XML: android:textSize="@dimen/some_name"
Java:
float dimen = Resources.getDimen(R.dimen.some_name) xml示例:
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3.     <dimenname="one_pixel">1px</dimen>
  4.     <dimenname="double_density">2dp</dimen>
  5.     <dimenname="sixteen_sp">16sp</dimen>
  6. </resources>

10. string

下面是官方給出的正確/錯誤的例子:
  1. //不使用轉義符則需要用雙引號包住整個string 
  2. <stringname="good_example">"This'll work"</string>
  3. //使用轉義符 
  4. <stringname="good_example_2">This/'ll also work</string>
  5. //錯誤 
  6. <stringname="bad_example">This won't work!</string>
  7. //錯誤 不可使用html轉義字元 
  8. <stringname="bad_example_2">XML encodings won&apos;t work either!</string>
     對於帶格式的string,例如在字串中某些文字設定顏色,可以使用html標籤。對於這型別的string,需要進行某些處理,在xml裡面不可以被其他資源引用。官方給了一個例子來對比普通string和帶格式string的使用:
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3.     <stringname="simple_welcome_message">Welcome!</string>
  4.     <stringname="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
  5. </resources>
Xml程式碼
  1. <TextView
  2.     android:layout_width="fill_parent"
  3.     android:layout_height="wrap_content"
  4.     android:textAlign="center"
  5.     android:text="@string/simple_welcome_message"/>
Java程式碼
  1. // Assign a styled string resource to a TextView on the current screen.
  2. CharSequence str = getString(R.string.styled_welcome_message);
  3. TextView tv = (TextView)findViewByID(R.id.text); 
  4. tv.setText(str); 
    另外對於帶風格/格式的string的處理,就麻煩一點點。官方給了一個例子
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3.   <stringname="search_results_resultsTextFormat">%1$d results for &lt;b>&amp;quot;%2$s&amp;quot;&lt;/b></string>
  4. </resources>
這裡的%1$d是個十進位制數字,%2$s是字串。當我們把某個字串賦值給%2$s之前,需要用htmlEncode(String)函式處理那個字串:
  1. //title是我們想賦值給%2$s的字串
  2. String escapedTitle = TextUtil.htmlEncode(title); 
 然後用String.format() 來實現賦值,接著用fromHtml(String) 得到格式化後的string:
  1. String resultsTextFormat = getContext().getResources().getString(R.string.search_results_resultsTextFormat); 
  2. String resultsText = String.format(resultsTextFormat, count, escapedTitle); 
  3. CharSequence styledResults = Html.fromHtml(resultsText); 

11. assets資料夾資源的訪問

       assets資料夾裡面的檔案都是保持原始的檔案格式,需要用AssetManager以位元組流的形式讀取檔案。       1. 先在Activity裡面呼叫getAssets()來獲取AssetManager引用。       2. 再用AssetManager的open(String fileName, int accessMode)方法則指定讀取的檔案以及訪問模式就能得到輸入流InputStream。        3. 然後就是用已經open file 的inputStream讀取檔案,讀取完成後記得inputStream.close()。       4.呼叫AssetManager.close()關閉AssetManager。