Theme和Style的區(qū)別
- Theme是應(yīng)用到一個Activity或者整個Application上的Style,而不是應(yīng)用于某個View上,應(yīng)用于某個View上的叫做Style。
- Theme是針對窗體級別,改變窗體樣式的,Style是針對窗體中的UI控件的,用來控件或者Layout的樣式。
- Theme和Style在定義的時候是一樣的,都是定義在
/res/values/目錄下。 - 每個
<style>都可以被應(yīng)用到Application/Activity或者應(yīng)用到某個View,應(yīng)用到App的時候就叫Theme,應(yīng)用到View的時候就叫Style。
定義一個Style
在
<resource>下的每個子節(jié)點 ,在編譯的時候都會被轉(zhuǎn)化為對象,通過他們定義的Style的名字來引用。
如果想自定義一個Style要從何下手呢?完全從頭做起?那你就錯了,在定義Style的時候,不需要從頭做起,
只需要繼承Android提供的Style,并且對你需要自定義的屬性進行修改即可。
例如:繼承TextView的默認Style,并對其進行修改
<style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">#00FF00</item>
</style>
如果你想繼承自己定義的Style,而不是系統(tǒng)默認的Style的話,你可以直接在自定義Style名后面加上“.”再
加新的屬性名即可,不需要再去寫parent。例如:創(chuàng)建一個新的Style并繼承上面自定義的GreenText
<style name=“GreenText.Big">
<item name="android:textSize”>30sp</item>
</style>
Style的屬性(Properties)
從上面的介紹知道了如何自定義一個Style,你只需繼承Android默認的Style并且重寫其中你需要自定義的字
段,那么都有哪些自定義的字段是可以重寫的呢?你可以從R.attr獲得所有可以重寫的屬性信息。但是不是所
有的R.attr中的屬性都適用于某個指定的View,你需要參考指定的View的屬性信息來確定哪些信息是可以被
重寫的。如果你給一個View指定了一些它不支持的屬性,他會自動忽略這些屬性。有些屬性不適合于任何View,
他只對Window有效這些屬性只能用作Theme的屬性去使用,如何區(qū)分哪些是對View有效哪些對其無效呢?
在R.attr中所有以Window開頭的屬性都是對View無效的,只能用做Theme屬性去使用,其余的可以
用View的屬性。
Style的應(yīng)用
應(yīng)用Style的方式有兩種:
- 對于一個獨立的View使用Style,只需要在View的布局文件中加入
style=“@style/xxxStyle”即可。 - 對整個Application或者 Activity使用Style(這個Style就是Theme),只需要
在Android manifest文件的<application>或者<activity>標(biāo)簽內(nèi)加上android:theme屬性即可。
當(dāng)Style應(yīng)用給一個View的時候,這個Style只會對這個View有效,如果這個View是一個ViewGroup的話,
那么也僅僅是對這個ViewGroup這個控件有效,對于ViewGroup內(nèi)部的View是沒有任何效果的。如果想對這
個ViewGroup中的所有View都有效的話,那么應(yīng)該將這個Style當(dāng)做Theme來使用,而非Style來使用。
(當(dāng)Theme使用的意思就是將這個Style應(yīng)用到這個ViewGroup所在的Activity或者整個Application)
Theme的選擇
在選擇使用什么樣的Theme的時候,需要根據(jù)系統(tǒng)所支持的版本來確定,高版本的系統(tǒng)中會提供一些Theme是低
版本中不含有的。因此為了對各個版本兼容,Android在res目錄下生成了多個values目錄來提供對不同版本的
兼容。
舉例如下:
假如當(dāng)前版本為3.0以下,我們可以在res/values目錄下定義style.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
···
<style name="LightThemeSelector" parent="android:Theme.Light”>
···
</style>
···
</resources>
假如當(dāng)前版本為3.0~4.0之間我們可以在res/values-v11目錄下定義style.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
···
<style name="LightThemeSelector" parent=“android:Theme.Holo.Light”>
···
</style>
···
</resources>
Holo主題是在API 11后提供的。如果在API 14以上,我們可以在res/values-v14目錄下定義。
這樣就可以很好的兼容多個版本,保持視覺上的統(tǒng)一。
如何去引用資源
引用可以通過:@、?來引用。那么這兩者的區(qū)別在哪里呢?“?”主要用來引用私有資源,“@"主要用來引用公有
資源。因為Android的資源Style等之間存在著繼承關(guān)系,因此”?”就相當(dāng)于類中的”this”,而”@“則相當(dāng)于一
個公共的對象(R),來對資源進行引用。通常”?”引用的資源都是當(dāng)前包(目錄)中的,而”@“引用的資源既可以
是當(dāng)前目錄中的也可以不同目錄中的。在對Android屬性繼承修改的時候,我們可能需要別的屬性,如果該屬性
在父類中不存在的話,那么我們可以在res/values/attrs.xml中通過declare-styleable標(biāo)簽來定
義我們所需要的屬性資源以及這些屬性資源的format格式,然后就可以在Style文件中直接使用。