Theme And Style

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的方式有兩種:

  1. 對于一個獨立的View使用Style,只需要在View的布局文件中加入style=“@style/xxxStyle”即可。
  2. 對整個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文件中直接使用。

資源

Android的Style資源
Android的Theme資源
Android的屬性資源
可以在Theme中使用的屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,856評論 25 709
  • 一、Attr 屬性,風(fēng)格樣式的最小單元; Attr 的定義 在自定義 View 的時候,在 res/attrs.x...
    秀花123閱讀 1,659評論 0 4
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,311評論 0 17
  • 21世紀的今天,人類的知識存量已經(jīng)很大,管理理論層出不窮,每年都在流行新的概念,我們已經(jīng)分不清東南西北,企業(yè)能不能...
    獨孤諾迪閱讀 1,189評論 0 0
  • 小子開啟話嘮模式:“媽媽,我走了你會想我嗎?” 懶媽:“你去哪里?” 小子:“寶貝去菜場買菜了!” 懶媽:“你有錢...
    歐元小姨閱讀 161評論 0 0

友情鏈接更多精彩內(nèi)容