Android主題與樣式

Android 風格和主題


Android xml風格和主題文件的編寫,是涉及到整個程序界面美觀的因素之一。 當設計應用程序時,你可以用風格和主題來統一格式化各種屏幕和UI元素。較好的應用風格和主題,可以實現美觀而統一的界面,和web中的CSS一樣,Android也可以爲界面定義全局、公用的Style。

Styles和Themes都是資源文件位於res/values,當然,可以用Android提供的一些默認的風格和主題資源,也可以自定義自己的主題和風格資源。

Styles:
風格是一個包含一種或者多種格式化屬性的集合,可以將其作爲一個單位用在佈局XML單個元素當中。 比如,可以定義一種風格來定義文本的文字大小和顏色,然後將其應用於視圖 元素的一個特定實例。

Theme:
主題是一個包含一種或者多種格式化屬性的集合,可以將其作爲一個單位用在應用程序所有的活動當中或者某個活動當中。比如,可以定義一個主題,它爲window frame和panel 的前景和背景設置了特定的顏色, 併爲菜單定義文字的大小和顏色屬性,然後將這個Theme應用到應用程序的Activity中。

Style和Theme的XML文件結構:
對每一個Styles和Themes,有一個<resources>根節點,給<style>元素增加一個全局唯一 的名字,也可以選擇增加一 個父類屬性。在後邊我們可以用這個名字來應用風格,而 父類屬性標識了當前風格是繼承 於哪個風格。在<style>元素內部,申明一個或者多個<item>,每一個<item>定義了一個名字屬性,並且在元素內部定義了這個風格的值。

新建自定義的風格和主題 :
1. 在res/values 目錄下新建一個名叫style.xml的文件。
2. 對每一個風格和主題,給<style>元素增加一個全局唯一的名字,和一個可選的父類屬性。在後邊我們可以名字來應用風格,而父類屬性標識了當前風格是繼承於哪個風格。

3. 在<style>元素內部,申明一個或者多個<item>,每一個<item>定義了一個名字屬性,並且在元素內部定義了這個風格的值。

4. 然後可以在其他XML資源,manifest或應用程序代碼中引用這些自定義資源。

風格Styles(SDK提供的Style的例子) :
<?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佈局文件當中定義的風格:
<EditText id="@+id/text1"
style="@style/SpecialText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello, World!" />

現在這個EditText部件所表現出來的風格將是我們在上邊的XML文件中所定義的那樣。

另:轉載一個自定義實例

1.在res/values 目錄下新建一個名叫style.xml的文件。
2.在style.xml定義內容如下:
<?xml version=”1.0″ encoding=”utf-8″?>
<resources>
<style name=”DavidStyleText1″>
<item name=”android:textSize”>18sp</item>
<item name=”android:textColor”>#EC9237</item>
</style>
<style name=”DavidStyleText2″>
<item name=”android:textSize”>14sp</item>
<item name=”android:textColor”>#FF7F7C</item>
<item name=”android:fromAlpha”>0.0</item>
<item name=”android:toAlpha”>0.0</item>
</style>
</resources>
上面樣式的定義,從字面意思就可以瞭解其功能了,下面看看如何應用它吧:

<!– 應用樣式1的TextView –>
<TextView
style="@style/DavidStyleText1"
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:gravity=”center_vertical|center_horizontal”
android:text=”moandroid”/>

<!– 應用樣式2的TextView –>
<TextView
style="@style/DavidStyleText2″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:gravity=”center_vertical|center_horizontal”
android:text=”www.moandroid.com”
android:autoLink=”all”/>

現在這個EditText組件的所表現出來的風格就爲我們在上邊的XML文件中所定義的那樣,如下:

Android <wbr><wbr>Styles <wbr><wbr>& <wbr><wbr>Themes(上)

看了新的界面是不是感覺漂亮多了,這也就是Styles的魅力吧。需要補充說明的是:單擊超鏈接,還可以打開網頁如下:

Android <wbr><wbr>Styles <wbr><wbr>& <wbr><wbr>Themes(上)

這是如何實現的了?TextView.setTextView不支持HTML TAG的輸出,所以即便寫成這樣:
mTextView01.setText(”<a href=\”http://www.moandroid.com/\”>mo-android|享受Android帶給我們的新體驗</a>”);實際輸出時,也就是純文本而已,並不會作HTML TAG的轉換。但若撇開HTML TAG之外(如“<”開頭的標記),在TextView里加上了android:autoLink=”all”,那麼正文中若有網址(http://),是可以被顯示的。

Theme依然在<style>元素裏邊申明,也是以同樣的方式引用。不同的是通過在Android Manifest中定義的<application>和<activity>元素將主題添加到整個程序或者某個 Activity,但是主題是不能應用在某一個單獨的View裏。

主題Themes :
就像風格一樣,主題依然在<style>元素裏邊申明,也是以同樣的方式引用。不同的是你通過在AndroidManifest中定義的<application>和<activity>元素將主題添加到整個程序或者活動中——主題並不能應用於個別視圖。
<?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屬性,值是一個主題的名字,如下:

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

Android中提供了幾種內置的資源,有好幾種主題可以用於切換而不用自己寫。如果你只是想讓你程序當中的某個Activity擁有這個主題,那麼你可以修改<activity>標籤。就像Android提供的其他內置資源一樣,有好幾種主題你可以切換而不用自己寫。比如你可以用對話框主題來讓你的活動看起來像一個對話框。在manifest中,像下面這樣引用一個Android主題:
<activity android:theme="@android:style/Theme.Dialog">

如果你喜歡一個主題,但是想做一些輕微的調整,你只需要將這個主題添加爲父主題。比如,我們將修改Theme.Dialog主題。爲此,創建一個風格以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)方法前。這確保系統將當前主題應用在你所有的用戶界面屏幕上。
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 Themes

瞭解關於缺省可用的主題和風格的信息,參見R.style

另:在轉載一個列子定義Theme的一個例子

<?xml version=”1.0″ encoding=”UTF-8″?>
<resources>
<style name=”NewTheme” parent=”android:Theme.Black”>
<item name=”android:windowNoTitle”>true</item>
<item name=”android:textSize”>14sp</item>
<item name=”android:textColor”>#FFFF0000</item>
</style>
</resources>

  • @ 表明我們應用的資源是前邊定義過的(或者在前一個項目中或者在Android 框架中)。
  • ?表明我們引用的資源的值在當前的主題當中定義過。

這些技巧只能用在XML資源當中

這裏需要注意的是,對於theme資源的引用,資源ID不是文件名(theme.xml),而是資源名(NewTheme)。運行後的界面顯示如下:

Android <wbr><wbr>Styles <wbr><wbr>& <wbr><wbr>Themes(下)

在AndroidManifest.xml中應用Theme

  • 爲了在當前所有的Activity當中使用Theme,可以打開AndroidManifest.xml 文件,編輯<application>標籤,讓其包含android:theme屬性,值是一個主題的名字,
  • 例如:<application android:theme=”@style/NewTheme”>
  • 如果只是想讓程序當中的某個Activity擁有這個Theme,那麼可以修改<activity>標籤。Android中提供了幾種內置的資源,有好幾種Theme你可以切換而不用自己寫。比如可以用對話框Theme來讓你的Activity看起來像一個對話框。在manifest中定義,
  • 例如:<activity android:theme=”@android:style/Theme.Dialog”>
  • 如果喜歡一個Theme,但是想做一些輕微的改變,只需要將這個Theme添加爲parent。Android SDK爲我們提供了很多現成的Theme,部分列舉如下:
    Android <wbr><wbr>Styles <wbr><wbr>& <wbr><wbr>Themes(下)
  • 比如:我們修改Theme.Dialog Theme,繼承ThemeDialog來生成一個新的Theme。
    <style parent=”@android:style/Theme.Dialog”>
    繼承了Theme.Dialog後,我們可以按照我們的要求來調整Theme。我們可以修改在Theme.Dialog中定義的每個item元素的值,然後我們在Android Manifest 文件中使用NewDialogTheme而不是 Theme.Dialog。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章