截至目前为止 Android 的版本已经出到了 8.0,但是一些低版本 Android 系统的手机依然有一定的市场,为了让在低版本的 Android 系统上运行的 APP 支持新版本推出的一些功能,Google 给我开发者提供了一系列的 Support Library 来解决高版本 SDK 开发的向下兼容,比如 appcompat-v7,support-v4 等。那么在 v7 appcompat 包中就添加了对操作栏以及 Material Design 样式的界面以及主题的支持。
什么时候使用 v7 包中的兼容主题
Google 在 Android 5.0(API 21)中提供了 Material Design 样式的主题 android:Theme.Material.xxx
,毫无疑问在 5.0 以前的版本中是不存在这种主题的,为了达到一致的操作体验,必须让我们的 APP 在低版本的 Android 平台上也能够使用这种主题,这时 v7 包提供的兼容主题 Theme.AppCompat.xxx
就起到了作用,它就能帮我们去适应多个平台。
几个基础知识
下面是在引用样式和主题的几个知识点
android:
, 在引用的主题和样式前添加android:
表示使用 APP 运行的当前平台的主题和样式,不添加就表示使用我们 APP 提供的主题和样式。 比如android:Theme.Material
和Theme.AppCompat.Light
,还用一些属性的引用也是同样的意思比如<item name="colorPrimary">xxx</item>
和<item name="android:colorPrimary">xxx</item>
。?attr/
表示引用主题属性值也就是attrs.xml
中的值。比如<item name="colorPrimary">?attr/colorPrimary</item>
表示应用当前使用的主题中的colorPrimary
的值,当然也可以加上android:
比如<item name="colorPrimary">?android:attr/colorPrimary</item>
表示 APP 当前运行平台对应的属性值。
v7 包如何向下兼容主题和样式
在 Android 5.0 之后最常用的主题是 android:Theme.Material.Light.NoActionBar
为了考虑兼容性我们一般会用 v7 包中的 Theme.AppCompat.Light.NoActionBar
替代,那么该主题是怎么做到向低版本(在 appcompat-v7:24.2.0 版本之前兼容到 Android 2.1 API Level 7,24.2.0之后的版本最低兼容到 Android 2.3 API Level 9)兼容的呢。
追踪 Theme.AppCompat.Light.NoActionBar
的父主题,我么会发现它会去继承 Base.V7.Theme.AppCompat.Light
主题,在 Base.V7.Theme.AppCompat.Light
主题中它会去补全 Android 2.3 相对 5.0 缺少的属性,也就是说低版本没有的属性我们都会去帮你加上然后给它赋上相应的值以达到兼容的效果
如果我们的 APP 运行在 5.0 的系统上,这时系统存在 android:Theme.Material.Light.NoActionBar
主题,所以在 Base.V7.Theme.AppCompat.Light
之前它会去根据系统的版本区别处理,在 5.0 以上的系统上就会把 Base.V7.Theme.AppCompat.Light
补全的属性再次进行复写,这里用了 ?android:attr/
很显然这里把这些属性的值改回了使用系统的属性值。
如果你没有就给你补全,如果你有了就用你存在的,就是这么做的。
最后
主题样式的向下兼容就是为了 APP 能在不同的 Android 平台上有一致的外观。在 appcompat-v7 包中它会在 attrs.xml
中去定义低版本没有的一些属性,然后在对应的兼容主题中去应用这些属性,以达到兼容的效果。