Android樣式和主題


如果已經熟悉在網頁設計中的層疊樣式表(CSS),了解Android樣式也是非常相似。每個 Android 視窗小部件,可以設定更改應用程式外觀風格相關的屬性。樣式可以指定屬性,如高度,填充,字型顏色,字型大小,背景顏色以及其它。

可以指定這些屬性在布局檔案如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >

   <TextView
   android:id="@+id/text_id"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:capitalize="characters"
   android:textColor="#00FF00"
   android:typeface="monospace"
   android:text="@string/hello_world" />

</LinearLayout>

不過這樣一來,我們需要定義的樣式屬性,每個屬性分別用於原始碼維護的角度來看這是非常不好的。因此,樣式定義應該放在單獨的檔案,如下解釋。

定義樣式

樣式可以定義在一個單獨的XML指定布局的XML資原始檔。此XML檔案位於 res/values/ 專案目錄,強制性的樣式檔案中<resources>作為根節點,XML檔案名稱是任意,但它必須使用.xml擴充套件名。

可以定義每個檔案中使用的多種樣式<style>標籤,但要使用唯一的名稱來標識此樣式。 Android 樣式屬性設定使用的<item>標籤,如下圖所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="CustomFontStyle">
      <item name="android:layout_width">fill_parent</item>
      <item name="android:layout_height">wrap_content</item>
      <item name="android:capitalize">characters</item>
      <item name="android:typeface">monospace</item>
      <item name="android:textSize">12pt</item>
      <item name="android:textColor">#00FF00</item>/> 
   </style>
</resources>
這裡<item>裡邊的值可以是一個關鍵字串,十六進位制的顏色,參考到另一個資源型別,或其他的值取決於樣式屬性。

使用樣式

樣式定義之後,就可以用它在XML布局檔案使用樣式屬性,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >

   <TextView
   android:id="@+id/text_id"
   style="@style/CustomFontStyle"
   android:text="@string/hello_world" />

</LinearLayout>

要理解這個概念涉及到Android 的樣式,可以檢查 樣式範例

樣式繼承

Android支援級聯樣式表在網頁設計風格非常類似繼承這種方式。可以使用這個繼承現有的樣式屬性,然後定義想要更改或新增屬性。

其操作簡單,建立一個新的的樣式繼承LargeFont上述CustomFontStyle風格定義,但字型的大小變大,可以編寫這樣的新的樣式:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="CustomFontStyle.LargeFont">
      <item name="android:textSize">20ps</item>
   </style>
</resources>

@style/CustomFontStyle.LargeFont 的XML布局檔案,可以參考這個新的樣式。可以繼續秉承這樣多次,只要願意,週期通過連結名稱。例如,可以擴充套件FontStyle.LargeFont的是紅色的,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="CustomFontStyle.LargeFont.Red">
      <item name="android:textColor">#FF0000</item>/> 
   </style>
</resources>

繼承這種技術通過連結在一起的名字僅適用於自己的資源定義的樣式。不能繼承:Android內建樣式的這種方式。要參照一個Android內建風格,如TextAppearance,必須使用父屬性,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="CustomFontStyle" parent="@android:style/TextAppearance">
      <item name="android:layout_width">fill_parent</item>
      <item name="android:layout_height">wrap_content</item>
      <item name="android:capitalize">characters</item>
      <item name="android:typeface">monospace</item>
      <item name="android:textSize">12pt</item>
      <item name="android:textColor">#00FF00</item>/> 
   </style>
</resources>

Android 主題

希望能夠理解樣式的概念,現在讓我們去了解什麼是主題。主題是什麼,主題只不過是要Android應用到整個活動或應用程式中統一樣式,而不是一個單獨的檢視樣式。

因此,當一個樣式應用為主題,將適用於每一個活動或應用程式檢視它支援每個樣式屬性。例如,可以應用一個主題Activity 活動的的同一CustomFontStyle風格,然後內部的所有文字,活動都會有綠色環保等寬字型。

要設定應用程式的所有活動的主題,開啟AndroidManifest.xml檔案,編輯<application>標籤包含了android:theme 屬性的風格名稱。例如:

<application android:theme="@style/CustomFontStyle">

但是,如果想有一個主題,只是在應用程式的一個Activity 活動,然後新增android:theme屬性到<activity>標籤。例如: 

<activity android:theme="@style/CustomFontStyle">

有一些由Android定義的預設主題,可以直接使用或繼承父屬性如下:

<style name="CustomTheme" parent="android:Theme.Light">
    ...
</style>

要理解這個概念,有關Android的主題,可以檢視 主題範例

預設樣式和主題

Android平台提供了一個大集合,可以在應用程式中使用的風格和主題。可以在R.style類的參考找到所有可用的樣式。要使用這裡列出的風格,在一個樣式名替換所有下劃線。例如,可以應用Theme_NoTitleBar主題使用如“@android:style/Theme.NoTitleBar”。可以看到下面的原始碼為Android的風格和主題: