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超过了系统支持的版本,系统会设置所支持的最高版本主题。
相关文章
相关标签/搜索