2012年4月10日 星期二

了解Android resource檔案 (一)

資源 (Resource) 在Android裡面凡指一切除了程式碼以外的資料。它可以是一個檔案,像是一個mp3音樂檔或是一個xml的版面layout檔;也可以是一個系統參數值像是一個預設的字串,一個定義button按鈕的高度的整數或是一個背景的顏色定義。撰寫程式的時候應該學習將程式碼與資源當作是獨立的文件來處理,這對日後多語系以及多螢幕的支援都有很大的幫助。

這份文件談資源由兩個方向分別討論。第一個以資源的類型來討論,分別討論資源的取用方式。第二個方向則討論系統預設資源的取用以及使用者自定資源的方式。一般來說我們建議盡量使用系統預設的資源,系統沒有的才使用自定資源來輔助,這樣可以加快程式的撰寫以及各平台間的相容性。

 Android常用資源類型:
  • String (字串)
  • Layout (面板配置)
  • String Array (字串陣列)
  • Plurals (一個字串的集合,用來表示數量通常是複數形式)
  • Color (顏色)
  • Dimension (尺寸)
  • Image (圖片)
  • Color-Drawable (一個被著色的方型,由xml寫成)
 Android系統資源存放於<android-sdk-windows>\platforms\<android version>\data\res 目錄下。初學者最先碰到會使用的應該是...\res\values\attrs.xml 檔案裡面的字型設定還有顏色設定。如果利用Eclipse IDE隨便拉一個TextView控制項,它的屬性如下:
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

這裡表示這個TextView的文字Style以系統內定的?android:attr/textAppearanceLarge來顯示。定義的資料可以在R.attr裡面找到。定義如下:          

public static final int textAppearanceLarge

Since: API Level 1
Text color, typeface, size, and style for "large" text. Defaults to primary text color.
Must be a reference to another resource, in the form "@[+][package:]type:name" or to a theme attribute in the form "?[package:][type:]name".
Constant Value: 16842816 (0x01010040)

如果仔細去追可以在...\res\values\attrs.xml裡面找到
        <!-- Text color, typeface, size, and style for "large" text. Defaults to primary text color. -->
        <attr name="textAppearanceLarge" format="reference" />

一個 <attr>單元有兩屬性:name以及formatname就是這個<attr>的名字,可以讓他在別的地方被參考到。 format表示這個<attr>是符合哪一種格式。formate可用格式有:
    • reference - if it references another resource id (e.g, "@color/my_color", "@layout/my_layout")
    • color
    • boolean
    • dimension
    • float
    • integer
    • string
    • fraction
    • enum - normally implicitly defined
    • flag - normally implicitly defined
舉上面TextView的例子來說,我們可以在...\res\values\attrs.xml裡面找到

<declare-styleable name="ViewGroup_Layout">
                           .....
        <attr name="layout_width" format="dimension">
           
            <enum name="fill_parent" value="-1" />
            
            <enum name="match_parent" value="-1" />
            
            <enum name="wrap_content" value="-2" />
        </attr>
                                 .....
         

這定義"layout_width"是一種"dimension"的屬性,所以在TextView裡面  android:layout_width="wrap_content"  或是 android:layout_width="60dp" 這樣的敘述句就變成有定義。

回到<attr name="textAppearanceLarge" format="reference" />, reference 表示textAppearanceLarge 可以在...\res\values\themes.xml 裡面找到它的定義。
       <style name="Theme">
                    ....
            <item name="textAppearanceLarge">@android:style/TextAppearance.Large</item>
                    ....
        
繼續往下追可以在...\res\values\style.xml裡面找到
      <style name="TextAppearance.Large">
        <item name="android:textSize">22sp</item>
    </style>

在Android程式設計個過程,我們提供程式碼追蹤的過程但不建議更改這些設定值。這裡我們也了解到textAppearanceLarge其實是一個Style設定,所以程式碼寫成
      
android:textAppearance="?android:attr/textAppearanceLarge"  或是

      sytle="?android:attr/textAppearanceLarge" 實際上是一樣的。

 Android 常用系統預設文字大小以及顏色
  • 文字大小  android:textAppearance="?android:attr/textAppearanceLarge"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textAppearance="?android:attr/textAppearanceSmall"
  • 字體顏色 android:textColor="?android:attr/textColorPrimary"
    android:textColor="?android:attr/textColorSecondary"
    android:textColor="?android:attr/textColorTertiary"
    android:textColor="?android:attr/textColorPrimaryInverse"
    android:textColor="?android:attr/textColorSecondaryInverse"

沒有留言:

張貼留言