Android的系統主題總結

Android主題的進化過程

在Android 3.0以前,Android的界面不論從系統仍是控件的主題都是按鈕爲白色,點擊事件爲黃色。如今看來確實挺簡陋的是吧。java

從Android 3.0(Api 11)開始,Google推出了Holo主題(對,就是咱們印象裏的黑底白字藍主色的那個主題),在4.0中更是發佈了應用設計規範Android Design。有了設計規範的指導,便有了更多的應用採用Holo主題。因此咱們能夠簡單地認爲Android Design說的就是Holo主題。可是這種主題只適用於移動設備,在其餘平臺上略顯突兀。android

因此從Android 5.0(Api 21)開始,Google又推出了Material Design,中文翻譯過來叫「材料設計語言」。其實它還有個名字叫Google Design,經過名字能夠看出這種設計語言旨在爲手機、平板電腦、臺式機和「其餘平臺」提供更一致、更普遍的「外觀和感受」。MD崇尚的就是圖層的扁平化,全部的圖層像紙或者卡片同樣重疊在一塊兒,因此在5.0中有了RecyclerView和CardView。圖層之間有間隔,因此在5.0中有了translationZ和elevation兩個屬性。同時也規範了Android的運動元素,界面上的每一個元素不是無端產生的,元素的產生必有出處,同時每一個圖層的產生和消失都有方向的約定,從哪出來就要從哪回去。這也是爲何5.0中會有Ripple,Circular Reveal,Activity Transition。app

有關MD的設計思想,能夠百度或者參考Google的官方文檔。本篇主要站在Android開發者的角度介紹Android開發中有關上述的幾種主題的引用方式。this

如何引用系統主題

咱們都知道主題的指定實際上實在styles.xml文件中。如今用Android Studio建一個工程,styles.xml默認是這個樣子的:spa

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

能夠看到咱們的主題默認繼承了Theme.AppCompat。那麼這個Theme.AppCompat究竟是什麼呢?就要從其餘的三個系統基本主題提及翻譯

  • android:Theme
  • android:Theme.Holo
  • android:Theme.Material

是的,這三個主題就對應了上一節說的三種Android主題。android:Theme是全部主題的超級父類。全部的主題都是它繼承或者間接繼承來的。android:Theme.Holo從Api 11開始纔可使用。android:Theme.Material從Api 21開始可使用。設計

若是咱們要在不一樣版本的系統上用各自的主題,好比在4.0之下的系統用android:Theme,4.0至5.0的系統用Holo主題,5.0及以後的系統使用Material Design,那咱們須要建不一樣的value-vX目錄。在各自的目錄中的style繼承相應的系統主題。在運行是系統就會根據平臺版本使用相應的主題。若是使用的主題沒有找到,那麼系統就會根據App指定的targetSdkVersion自動設置主題,假如設置的targetSdkVersion超過了系統的版本,系統就設置爲支持的最高系統sdk版本的主題。code

最後一句話怎麼理解,舉個例子,若是在咱們在Api 24的sdk下進行開發,設置咱們的應用targetSdkVersion=16,應用的資源目錄下創建value-16,這是針對4.4以上平臺的資源目錄,在styles.xml中咱們繼承android:Theme.Material,這很明顯是在5.0系統之上才能用的。雖然Android Studio會給出提示,但能夠編譯經過。如今咱們把App放在一臺4.4的機器上跑,這時系統是找不到android:Theme.Material這個主題的。那麼系統就會看targtSdkVersion,發現是16,因此係統就會將App的主題設置爲Holo的。若是咱們其餘的全部配置都不變,只把targetSdkVersion改爲9,系統就會把App的主題設置爲android:Theme的主題。這時若是把targetSdkVersion改爲24,4.4的機器是不支持24的,那麼出來的效果依然是android:Theme.Holo主題。xml

Theme.AppCompat

上節介紹完了三種Android系統主題。那麼有同窗就要問了,若是我要在4.4的機器上使用Material主題怎麼辦呢?沒事,Google已經幫咱們想好了解決方案。畢竟Google但願在不一樣的平臺和版本上推廣Material Design嘛。這樣才能給用戶提供一致性的體驗。介於此,Android裏就有了Theme.AppCompat主題和AppCompatActivity。細心的同窗也會發現如今用Android Studio新建一個工程,默認的MainActivity繼承的是AppCompatActivitiy,默認的主題就是Theme.AppCompat。繼承

咱們先來講Theme.AppCompat,這個主題可讓5.0如下的系統使用Material主題。咱們只須要讓咱們的系統主題繼承Theme.AppCompat便可。只須要指定這個就OK了,是否是很簡單。

有必要說的是,使用了Theme.AppCompat以後,targetSdkVersion就不受影響了。繼續拿上一節的例子說,在Api24 Sdk下開發,targtSdkVersion=9,跑在4.4的機器上,你會發現依然是Material主題。

因此能夠總結出,應用使用了Theme.AppCompat主題,不論咱們的targetSdkVersion指定爲多少,跑在任意版本的系統上都會呈現出Material主題。

AppCompatActivity的主題

如今輪到介紹AppCompatActivity,它是替換ActionBarActivity的。主要是爲了給不一樣平臺兼容ActionBar,並支持ToolBar等。AppCompatActivity的特性不是本篇的討論重點,感興趣了同窗能夠自行查閱資料。針對主題這個話題,咱們只須要知道,AppCompatActivity(包括ActionBarActivity)的子Activity必須使用Theme.AppCompat或Theme.AppCompat的子主題,若是不是,編譯時不會給出任何警告,但運行時會拋出異常,

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

因此咱們使用AppCompatActivity的時候須要注意。不過若是咱們的Activity使用了Theme.AppCompat主題,但不必定要繼承AppCompatActivity。

總結

經過以上的介紹,咱們進行一個總結。

  • 目前的系統有四種基本主題:
    • android:Theme
    • android:Theme.Holo ( >= Api 11)
    • android:Theme.Material( >= Api 21)
    • Theme.AppCompat

其餘的主題,諸如xxx.Light, xxx.Light.Notitle等都是繼承自這四個基本主題,能夠根據項目須要自行引用。

  • 若是須要在作到全系統兼容Material Design,那麼繼承了Theme.AppCompat,這樣不論咱們的targetSdkVersion指定爲多少,跑在任意版本的系統上都會呈現出Material主題。
  • AppCompatActivity依賴Theme.AppCompat,Theme.AppCompat不依賴AppCompatActivity。
  • 若是咱們要在不一樣版本的系統上設置不一樣的主題,那麼須要建立不一樣版本的values-vX目錄,根據須要繼承android:Theme、android:Theme.Holo、android:Theme.Material。這樣系統會根據values-vX找到相應的主題。
  • 若是系統在運行時沒有找到主題,那麼會根據targetSdkVersion設置不一樣的主題。假如咱們指定的targetSdkVersion超過了系統支持的版本,系統會設置所支持的最高版本主題。
相關文章
相關標籤/搜索