android的樣式(style)與主題(theme)

 Android上的Style分爲了兩個方面:
1,Theme是針對窗體級別的,改變窗體樣式;
2,Style是針對窗體元素級別的,改變指定控件或者Layout的樣式。

Android系統的themes.xml和style.xml(位於系統源代碼frameworks\base\core\res\res\values\)包含了很多系統定義好的style,建議在裏面挑個合適的,然後再繼承修改。

 

  • 風格是一個包含一種或者多種格式化屬性的集合,你可以將其用爲一個單位用在佈局XML單個元素當中。比如,你可以定義一種風格來定義文本的字號大小和顏色,然後將其用在View元素的一個特定的實例。
  • 主題是一個包含一種或者多種格式化屬性的集合,你可以將其爲一個單位用在應用中所有的Activity當中或者應用中的某個Activity當 中。比如,你可以定義一個主題,它爲window frame和panel 的前景和背景定義了一組顏色,併爲菜單定義可文字的大小和顏色屬性,你可以將這個主題應用在你程序當中所有的Activity裏。
風格和主題都是資源。你可以用android提供的一些默認的風格和主題資源,你也可以自定義你自己的主題和風格資源。
如何新建自定義的風格和主題:
1.在res/values 目錄下新建一個名叫style.xml的文件。增加一個<resources>根節點。
2.對每一個風格和主題,給<style>element增加一個全局唯一的名字,也可以選擇增加一個父類屬性。在後邊我們可以用這個名字來應用風格,而父類屬性標識了當前風格是繼承於哪個風格。
3.在<style>元素內部,申明一個或者多個<item>,每一個<item>定義了一個名字屬性,並且在元素內部定義了這個風格的值。
4.你可以應用在其他XML定義的資源。
——————————————————————————————–
風格
下邊是一個申明風格的實例:
 
<?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當中的名字的屬性可以是一個字符串,一個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文件中所定義的那樣。

主題

就像風格一樣,主題依然在<style>元素裏邊申明,也是以同樣的方式引用。不同的是你通過在Android Manifest中定義的<application>和<activity>元素將主題添加到整個程序或者某個 Activity,但是主題是不能應用在某一個單獨的View裏。
下邊是申明主題的一個例子:
<?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當中設置主題

爲了在成用當中所有的Activity當中使用主題,你可以打開AndroidManifest.xml 文件,編輯<application>標籤,讓其包含android:theme屬性,值是一個主題的名字,如下:
<application android:theme="@style/CustomTheme">
如果你只是想讓你程序當中的某個Activity擁有這個主題,那麼你可以修改<activity>標籤。
Android中提供了幾種內置的資源,有好幾種主題你可以切換而不用自己寫。比如你可以用對話框主題來讓你的Activity看起來像一個對話框。在manifest中定義如下:
<activity android:theme="@android:style/Theme.Dialog">
如果你喜歡一個主題,但是想做一些輕微的改變,你只需要將這個主題添加爲父主題。比如我們修改Theme.Dialog主題。我們來繼承Theme.Dialog來生成一個新的主題。
<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
繼承了Theme.Dialog後,我們可以按照我們的要求來調整主題。我們可以修改在Theme.Dialog中定義的每個item元素的值,然後我們在Android Manifest 文件中使用CustomDialogTheme 而不是 Theme.Dialog 。

在程序當中設置主題

如果需要的話,你可 以在Activity當中通過使用方法setTheme()來加載一個主題。注意,如果你這麼做的話,你應該初始化任何View之前設置主題。比如,在調 用setContentView(View) 和inflate(int, ViewGroup)方法前。這保證系統將當前主題應用在所有的UI界面。例子如下:
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 ...
 setTheme(android.R.style.Theme_Light);
 setContentView(R.layout.linear_layout_3);
}
如果你打算在程序代碼中來加載主界面的主題,那麼需要注意主題當中不能包括任何系統啓動這個Activity所使用的動畫,這些動畫將在程序啓動前顯示。在很多情況下,如果你想將主題應用到你的主界面,在XML中定義似乎是一個更好的辦法。

下面的前三個之外直接複製就會出錯。@是說明系統已經定義過的,@android:style/  是必須帶上的。

?android:theme="@android:style/Theme.Dialog" 

  將一個Activity顯示爲對話框模式
?android:theme="@android:style/Theme.NoTitleBar"  不顯示應用程序標題欄
?android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不顯示應用程序標題欄,並全屏
?android:theme="Theme.Light"  背景爲白色
?android:theme="Theme.Light.NoTitleBar"  白色背景並無標題欄 
?android:theme="Theme.Light.NoTitleBar.Fullscreen"  白色背景,無標題欄,全屏
?android:theme="Theme.Black"  背景黑色
?android:theme="Theme.Black.NoTitleBar"  黑色背景並無標題欄
?android:theme="Theme.Black.NoTitleBar.Fullscreen"    黑色背景,無標題欄,全屏
?android:theme="Theme.Wallpaper"  用系統桌面爲應用程序背景
?android:theme="Theme.Wallpaper.NoTitleBar"  用系統桌面爲應用程序背景,且無標題欄
?android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"  用系統桌面爲應用程序背景,無標題欄,全屏
?android:theme="Translucent"
?android:theme="Theme.Translucent.NoTitleBar" 半透明,無標題
?android:theme="Theme.Translucent.NoTitleBar.Fullscreen" 半透明,無標題,全屏
?android:theme="Theme.Panel" 面板風格顯示
?android:theme="Theme.Light.Panel" 平板風格顯示

發佈了9 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章