深度讲解 Android 主题层级

本文讲的是深度讲解 Android 主题层级,

当使用安卓主题和支持库时,你可能会遇见以上这些名字,并且好奇:

  • Base.V{something}Theme.Base.AppCompatPlatform.AppCompat 是什么?
  • 这些主题是如何组织起来的?
  • 我应当用哪一个?

在本文中,我将回答上述问题,并尝试阐明这一切是如何工作的。

AppCompat v7

鉴于不同的安卓平台定义了不同的主题、样式和属性,最初安卓主题的层级非常繁杂,而且很不直观。直到 v7 支持库带来了全新的主题架构,使得所有安卓平台自 API v7 起能够获得一致的材质外观 (Matertial apperance)。Base.V... 和Platform.AppCompat 正是在这个时候被加入了进来。

安卓开发者们在 GitHub 上撰写了一篇 README 解释主题层级,我推荐你看一看。

在 AppCompat 中,主题被划分为四个层次,每个层次继承自更低一层:

Level1 → Level2 → Level3 → Level4

除此之外,每个版本的安卓 API 都有一个对应的 values-v{api} 文件夹存放各自需要定义或覆写的样式和属性:

values, values-v11, values-v14, values-v21, values-v22, values-v23

Level 4 (最底层)

最底层包含了 Platform.AppCompat 主题。该主题总是继承自当前版本中的默认主题,例如:

values

Platform.AppCompat -> android:Theme

values-v11

Platform.AppCompat -> android:Theme.Holo

values-v21

Platform.AppCompat -> android:Theme.Material

Level 3

大部分工作在这一层被完成,Base.V7.Theme.AppCompatBase.V11.Theme.AppCompatBase.V21.Theme.AppCompat 等也是在这一层被定义。这些主题都继承自 Platform.AppCompat

values

Base.V7.Theme.AppCompat* → Platform.AppCompat → android:Theme

values-v11

Base.V11.Theme.AppCompat → Platform.AppCompat → android:Theme.Holo

values-v21

Base.V21.ThemeAppCompat → Base.V7.ThemeAppCompat → Platform.AppCompat → android:Theme.Material

*: 还包括 Base.V7.Theme.AppCompat.Light, Base.V7.Theme.AppCompat.Dialog 等变体。

绝大多数属性和几乎所有工作在 Base.V{api}.Theme.AppCompat 中被定义和完成。ActionBar, DropwDown, ActionMode, Panel, List, Spinner, Toolbar 等控件中的所有属性都在这里被定义。你可以在 这个链接 中查看更多详情。

Level 2

根据安卓的官方解释,我们在这一层拿到的主题只是第三层主题的别名:

There are the themes which are pointers to the correct third level theme.They can also be used to set attributes for that specific platform (and platforms up until the next declaration).

这些主题指向第三层中相应的主题。它们也可以用来配置那些特定平台的属性。

values

Base.Theme.AppCompat* → Base.V7.Theme.AppCompat

values-v21

Base.Theme.AppCompat → Base.V21.Theme.AppCompat

*: 还包括 Base.Theme.AppCompat.Light, Base.Theme.AppCompat.Dialog 等变体。

Level 1 (最顶层)

Theme.AppCompatTheme.AppCompat.LightTheme.AppCompat.NoActionBar 等主题在这里被定义。开发者应该使用这些主题,而非那些更底层的。

values

Theme.AppCompat → Base.Theme.AppCompat

这些主题只在 values 文件夹中被定义,并根据安卓应用运行的 API 环境,继承自下层中定义的相应主题。例如:

  • Running in v7 (Android 2.2)

Theme.AppCompat → Base.Theme.AppCompat → Base.V7.Theme.AppCompat → Platform.AppCompat → android:Theme

  • Running in v11 (Android 3.0)

Theme.AppCompat → Base.Theme.AppCompat → Base.V7.Theme.AppCompat → Platform.AppCompat → Platform.V11.AppCompat → android:Theme.Holo

  • Running in v21 (Android 5.0)

Theme.AppCompat → Base.Theme.AppCompat → Base.V21.Theme.AppCompat → Base.V7.Theme.AppCompat → Platform.AppCompat → android:Theme.Material

以上便是我们如何在所有安卓 API 下获得一致的材质外观的答案。正如你所见到的,当我们顺着主题的层级仔细研究时会发现,这一过程有点小复杂。

主题图示(简化版)

ThemeOverlays

在所有可用的主题中,我们可以发现一个名字带有 ThemeOverlay 的系列:

  • ThemeOverlay
  • ThemeOverlay.Light
  • ThemeOverlay.ActionBar.Light
  • ThemeOverlay.ActionBar.Dark

这些主题又是做什么的呢?答案是 仅用于为特定的用途定义必要的属性。 例如 ThemeOverlay 主题只定义了textColortextAppearance,窗口的颜色属性和一些类似 colorControlButton 的属性;通常用作于 Toolbar 主题的ThemeOverlay.ActionBar.Light,仅将 colorControlButton 的值定义为 ?attr:textColorSecondary

结论

我在学习这些 AppCompat 主题的时候,顺便写了个 小应用 帮助大家浏览安卓主题和样式。希望能够对大家有所帮助。

注意:Google Play 商店的链接有时会失效几个小时。

我希望这篇文章能够帮你了解这些 AppCompat 主题是如何被组织到一起。还有一些我原本希望涉及的内容,但那样文章就太长了,或许会放在第二部分中。






原文发布时间为:2016年06月22日


本文来自合作伙伴掘金,了解相关信息可以关注掘金网站。

时间: 2024-12-09 18:29:40

深度讲解 Android 主题层级的相关文章

深度理解Android InstantRun原理以及源码分析

深度理解Android InstantRun原理以及源码分析 @Author 莫川 Instant Run官方介绍 简单介绍一下Instant Run,它是Android Studio2.0以后新增的一个运行机制,能够显著减少你第二次及以后的构建和部署时间.简单通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果.而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修改后的效果. 传统的代

android主题-Android主题制作初步了解

问题描述 Android主题制作初步了解 大神们有没有了解Android手机主题是怎么做的?用什么做的?用跟别的apk那样开发么?还是有他自己的开发工具? 解决方案 主题开发不需要写代码的,就是设计图. 建议先从一个手机型号开始. 如果你用的是小米手机,就到小米miui商店或者开放平台,有专门处理主题设计的网站,里面有资料有教程. 如果你用的手机是魅族,魅族也有主题设计的网站.你搜搜就知道了.很简单.花费时间的就是设计! 设计是有要求的,要看各个手机公司的要求.如果是小米手机,要把设计的主题打包

Android主题切换之探究白天和夜间模式_Android

智能手机的迅速普及,大大的丰富了我们的娱乐生活.现在大家都喜欢晚上睡觉前玩会儿手机,但是应用的日间模式往往亮度太大,对眼睛有较为严重的伤害.因此,如今的应用往往开发了 日间和夜间 两种模式供用户切换使用,那日间和夜间模式切换究竟是怎样实现的呢? 在文字类的App上面基本上都会涉及到夜间模式.就是能够根据不同的设定.呈现不同风格的界面给用户.而且晚上看着不伤眼睛.实现方式也就是所谓的换肤(主题切换).对于夜间模式的实现网上流传了很多种方式.这里先分享一个方法给大家.通过设置背景为透明的方法.降低屏

网站分析工具深度讲解之访问来源统计(三)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 相关文章: 关于访问来源统计的"商业背景"和"技术背景"请查看网站分析工具深度讲解之访问来源统计(一) 关于访问来源统计的"虚拟工具"和"现实工具"请查看网站分析工具深度讲解之访问来源统计(二) 分析思路扩展 1. 访问来源概要 访问来源概要提供来到网站访客的方式分布情况,站长根据这些数据来判断网站推广/营销方面的效果,但这些数据的别后又暗藏着很多的陷阱,怎么样躲过数据别后这样那

网站分析工具深度讲解之访问来源统计(二)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 虚拟工具 1. 访问来源概要 访问者来源概要功能在绝大多数网站分析工具中都会提供,工具中通常会以饼图或者表格的方式提供给用户直观的比例数据.如下图所示: 分析方法 分析轴访问来源类型 条件无 访问者来源概要中,通常会使用个种指标值进行来源质量与数量的评估,通常包括: 1. 会话数 2. PV数 3. 跳出数 4. 转化数 5. 转化率 6. 访客数 7. 独立IP数 根据用户所关注的指标不同,可以在大尺度上衡量出网站进站效果的对比,从而对网站推广投

Android主题切换之探究白天和夜间模式

智能手机的迅速普及,大大的丰富了我们的娱乐生活.现在大家都喜欢晚上睡觉前玩会儿手机,但是应用的日间模式往往亮度太大,对眼睛有较为严重的伤害.因此,如今的应用往往开发了 日间和夜间 两种模式供用户切换使用,那日间和夜间模式切换究竟是怎样实现的呢? 在文字类的App上面基本上都会涉及到夜间模式.就是能够根据不同的设定.呈现不同风格的界面给用户.而且晚上看着不伤眼睛.实现方式也就是所谓的换肤(主题切换).对于夜间模式的实现网上流传了很多种方式.这里先分享一个方法给大家.通过设置背景为透明的方法.降低屏

以一个着色游戏展开讲解Android中区域图像填色的方法_Android

一.着色游戏概述 近期群里偶然看到一哥们在群里聊不规则图像填充什么四联通.八联通什么的,就本身好学务实的态度去查阅了相关资料.对于这类着色的资料,最好的就是去搜索些相关app,根据我的观察呢,不规则图像填充在着色游戏里面应用居多,不过大致可以分为两种: 基于层的的填充 基于边界的填充 那么针对上述两种,我们会通过两篇博文来讲解,本篇就是叙述基于层的填充方式,那么什么基于层的填充方式呢?其实就是一张图实际上是由多个层组成的,每个层显示部分图像(无图像部分为透明),多层叠加后形成一张完整的图案,图层

详细讲解Android中使用LoaderManager加载数据的方法_Android

Android的设计之中,任何耗时的操作都不能放在UI主线程之中.所以类似于网络操作等等耗时的操作都需要使用异步的实现.而在ContentProvider之中,也有可能存在耗时的操作(当查询的数据量很大的时候),这个时候我们也需要使用异步的调用来完成数据的查询. 当使用异步的query的时候,我们就需要使用LoaderManager了.使用LoaderManager就可以在不阻塞UI主线程的情况下完成数据的加载. (1)获取loaderManger:activity.getLoaderManag

详细讲解Android中使用LoaderManager加载数据的方法

Android的设计之中,任何耗时的操作都不能放在UI主线程之中.所以类似于网络操作等等耗时的操作都需要使用异步的实现.而在ContentProvider之中,也有可能存在耗时的操作(当查询的数据量很大的时候),这个时候我们也需要使用异步的调用来完成数据的查询. 当使用异步的query的时候,我们就需要使用LoaderManager了.使用LoaderManager就可以在不阻塞UI主线程的情况下完成数据的加载. (1)获取loaderManger:activity.getLoaderManag