應用風格和主題Applying Styles and Themes
當設計應用程序時,你可以用風格和主題來統一格式化各種屏幕和UI元素。
l 風格是一個包含一種或者多種格式化屬性的集合,你可以將其作為一個單位用在佈局XML單個元素當中。比如,你可以定義一種風格來定義文本的字號大小和顏色,然後將其應用於視圖元素的一個特定實例。
l 主題是一個包含一種或者多種格式化屬性的集合,你可以將其作為一個單位用在應用程序所有的活動當中或者某個活動當中。比如,你可以定義一個主題,它為窗口框架和面板的前景和背景設置瞭特定的顏色,並為菜單定義文字的大小和顏色屬性,然後將這個主題應用到你的應用程序的活動中。
風格和主題都是資源。你可以用Android提供的一些默認的風格和主題資源,也可以自定義你自己的主題和風格資源。
要創建自定義的風格和主題:
1.在應用程序res/values目錄下新建一個名為styles.xml的文件。增加一個<resources>根節點。
2.對每一個風格和主題,添加一個<style>元素,帶有一個全局唯一的名字,和一個可選的,父風格屬性。在後邊我們可以用這個名字來引用這些風格,而父風格屬性表明當前風格是繼承於哪個風格。
3.在<style>元素內部,定義一個或者多個<item>元素來描述具體的格式,每一個<item>以一個名字屬性標示瞭它的風格特性,並且在元素內部定義瞭這個風格的值。
4.然後你可以在其他XML資源,manifest或應用程序代碼中引用這些自定義資源。
風格Styles
下邊是一個聲明風格的實例:
[java] <?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="SpecialText" parent="@style/Text">
<item name="android:textSize">18sp</item>
<item name="android:textColor">#008</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="SpecialText" parent="@style/Text">
<item name="android:textSize">18sp</item>
<item name="android:textColor">#008</item>
</style>
</resources>
如上所示,你可以用<item>元素來為你的風格定義一組格式化的值。在Item當中的名字name屬性可以是一個字符串,一個16進制數所表示的顏色或者任何其他資源的引用。
註意在<style>元素中的父類屬性。這個屬性讓你可以能夠定義一個資源,當前風格可以從這個資源當中繼承到值。你可以從任何包 含這個風格的資源當中繼承此風格。通常上,你的資源應該一直直接或者間接地繼承Android的標準風格資源。 這樣的話,你就隻需要定義你想改變的值。
在這個例子當中的EditText元素,演示瞭如何引用一個XML佈局文件當中定義的風格:
[java] <EditText id="@+id/text1"
style="@style/SpecialText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello, World!" />
<EditText id="@+id/text1"
style="@style/SpecialText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello, World!" />
現在這個EditText部件所表現出來的風格將是我們在上邊的XML文件中所定義的那樣。
主題Themes
就像風格一樣,主題依然在<style>元素裡邊申明,也是以同樣的方式引用。不同的是你通過在Android Manifest中定義的<application>和<activity>元素將主題添加到整個程序或者活動中-主題並不能應用於個別視圖。
下邊是聲明主題的一個例子:
[java] <?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme">
<item name="android:windowNoTitle">true</item>
<item name="windowFrame">@drawable/screen_frame</item>
<item name="windowBackground">@drawable/screen_background_white</item>
<item name="panelForegroundColor">#FF000000</item>
<item name="panelBackgroundColor">#FFFFFFFF</item>
<item name="panelTextColor">?panelForegroundColor</item>
<item name="panelTextSize">14</item>
<item name="menuItemTextColor">?panelTextColor</item>
<item name="menuItemTextSize">?panelTextSize</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme">
<item name="android:windowNoTitle">true</item>
<item name="windowFrame">@drawable/screen_frame</item>
<item name="windowBackground">@drawable/screen_background_white</item>
<item name="panelForegroundColor">#FF000000</item>
<item name="panelBackgroundColor">#FFFFFFFF</item>
<item name="panelTextColor">?panelForegroundColor</item>
<item name="panelTextSize">14</item>
<item name="menuItemTextColor">?panelTextColor</item>
<item name="menuItemTextSize">?panelTextSize</item>
</style>
</resources>
註意我們用瞭@符號和?符號來引用資源。地址符@表明我們引用的資源是其它地方定義過的(也許在這個項目中或者在Android框架中)。問號符?表明我們引用的資源的值在當前加載的主題中。這通過以名字引用特定的<item>來完成(比如,panelTextColor使用瞭分配給panelForegroundColor的相同顏色)。這種技巧隻能用在XML資源當中。
在manifest中設置主題Set the theme in the manifest
為瞭給應用程序所有的活動設置主題,你可以打開清單文件AndroidManifest.xml,編輯<application>標簽,讓其包含android:theme屬性,值是一個主題的名字,如下:
[java] <application android:theme="@style/CustomTheme">
<application android:theme="@style/CustomTheme">
如果你隻是想讓你程序當中的某個Activity擁有這個主題,那麼你可以修改<activity>標簽。
就像Android提供的其他內置資源一樣,有好幾種主題你可以切換而不用自己寫。比如你可以用對話框主題來讓你的活動看起來像一個對話框。在manifest中,像下面這樣引用一個Android主題:
[java] <activity android:theme="@android:style/Theme.Dialog">
<activity android:theme="@android:style/Theme.Dialog">
如果你喜歡一個主題,但是想做一些輕微的調整,你隻需要將這個主題添加為父主題。比如,我們將修改Theme.Dialog主題。為此,創建一個風格以Theme.Dialog為父主題:
[java] <style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
就這樣,我們已經繼承瞭Android對話框主題,因此我們可以按照自己的意願來調整主題。這樣,對於這個對話框主題中每個我們想要改變的item,我們可以在這裡重新定義它的值然後在Android Manifest 文件中使用CustomDialogTheme而不是Theme.Dialog。
在程序當中設置主題Set the theme from the application
如果需要的話,你還可以以編程的方式來給一個活動加載主題。為此,要使用setTheme()方法。註意,這樣做,你應該在初始化任何上下文中的視圖之前設置主題。比如,在調用setContentView(View)或者inflate(int, ViewGroup)方法前。這確保系統將當前主題應用在你所有的用戶界面屏幕上。例子如下:
[html] protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
…
setTheme(android.R.style.Theme_Light);
setContentView(R.layout.linear_layout_3);
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
…
setTheme(android.R.style.Theme_Light);
setContentView(R.layout.linear_layout_3);
}
如果你打算在程序代碼中來加載主界面的主題,那麼需要註意這個主題將不能應用於任何系統用來啟動這個活動的動畫,這些動畫將在應用程序啟動前發生。在大多數情況下,如果你想將主題應用到你的主界面,在XML中定義是一個更好的辦法。
要想瞭解關於自定義風格和主題以及如何在應用程序中引用它們的詳細信息,請參見可用資源類型:風格和主題Available Resource Types: Style and Themesfile:///D:/android-sdk-windows-1.5_r2/docs/guide/topics/resources/available-resources.html#stylesandthemes。
摘自 落日小屋