appcompat-v7 是如何向下兼容主题样式的

截至目前为止 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.MaterialTheme.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 中去定义低版本没有的一些属性,然后在对应的兼容主题中去应用这些属性,以达到兼容的效果。

转载于:https://juejin.im/post/59da269751882545ea191d63

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值