android colorstatelist_Android 样式系统 | 主题背景属性

5e83eef81011f034ccea51ff7ae8822c.png

在 Android 样式系统系列的前几篇文章中,我们介绍了主题背景与样式的区别,以及为什么说通过主题背景和公共主题背景属性来分解您要实现的内容是一个不错的主意,请点击链接回顾:

  • Android 样式系统 | 主题背景和样式

  • Android 样式系统 | 常见的主题背景属性

这会让我们通过创建更少的布局或样式,以隔离主题背景中的修改。在实际开发中,您通常希望根据主题背景改变颜色,因此您应该始终通过主题背景属性来引用颜色。这意味着您可以将如下代码视为有代码异味 (Code smell):
<View …  android:background="@color/white"/>
相反,您应该使用主题背景属性,它允许您按主题更改颜色,例如,在深色主题中提供一个不同的值:
<View …  android:background="?attr/colorSurface"/>
  • 深色主题https://developer.android.google.cn/guide/topics/ui/look-and-feel/darktheme

即使您当前不支持其他主题 (什么,您的应用还没有支持深色主题?),我们依然建议您采用这种方法,因为这样会让新主题的采用变得更加简单。

合格的 Colors 文件

您可以通过在不同的配置中添加不同的值来改变颜色 (例如,在 res/values/colors.xml 中和在 res/values-night/colors.xml 中的备选值里均定义 @color/foo),但我们依然建议您使用主题背景属性来替代它们。对颜色层级的区分,会迫使您给颜色赋予语义化名称,换句话说,您应该不会在给颜色命名为 @color/white 的同时,又为深色模式提供一个深色变体,这会让人感到非常困惑。所以,您可能会想要使用一个语义化名称,例如 @color/background。这种方法带来的问题是它合并了颜色声明和具体的值,因此,它并没有指出颜色是可以或者能够随主题背景而变化的。@colors 的变化也会鼓励您创造更多颜色。如果在不同的情境下要使用具有相同值的、新的语义化命名的颜色 (即,不是背景色但应该使用相同颜色),这时候您仍需要在 colors 文件中创建新的条目。通过使用主题背景属性,我们可以将语义颜色的声明从提供它们的值中区分开来,而且让使用方更清楚地了解到颜色会随主题背景而变化 (因为它们使用 ?attr/ 语法)。将颜色声明保持为字面值,您就可以自定义应用使用的颜色调色板,并在主题背景级别修改它们,这会让 color.xml 较小且易维护。这种方法的额外好处是,布局/样式引用这些颜色时复用性变得更高。由于主题背景可以被覆盖或者改变,因此这间接表示: 您不需要创建其他布局或样式就可以更改某些颜色——您可以在相同的布局中使用不同的主题背景。

始终使用?

在某些情况下,您或许不想按照主题背景更改颜色。例如,在 Material Design 规范文档中提到,您可能希望在浅色和深色主题中均使用同一类型的颜色。
  • Material Design 规范文档https://material.io/design/color/dark-theme.html#ui-application
c5fded97ba19ad22a1080ab64e795ec4.png在这种特殊情况下,直接引用颜色资源是再合适不过的:
<FloatingActionButton …  app:backgroundTint="@color/owl_pink_500"/>

当前发展状况

当使用 ColorStateLists时,您可能也不会在您的布局/样式中直接引用主题背景属性。
<View …  android:background="@color/primary_20"/>
  • ColorStateListshttps://developer.android.google.cn/reference/android/content/res/ColorStateList
如果 primary_20 是一个 ColorStateList,它本身引用主题背景属性来获取色值也可能是合理的 (请参见下文)。ColorStateLists 通常为不同的状态 (按下,禁用等) 提供不同的颜色,但它还有另外一种可用于主题化功能您可在选取的颜色上指定透明度值:
<selector …  <item android:alpha="0.20" android:color="?attr/colorPrimary" />selector>

这种单项 ColorStateList (即只提供单个默认颜色,而非每种状态的不同颜色) 有助于减少您需要维护的颜色资源数量。它并没有定义一个新的颜色资源的方式来手动为您 (每一个配置文件) 的 primary 颜色设置 alpha 值,而是通过改变当前主题背景中的 colorPrimary 的方式。如果您的原始颜色发生了变化,则只需要在一个地方进行更新,无需调整所有已更新的地方。

虽然此技术很有用,但仍有一些注意事项:

1. 如果指定的颜色也具有 alpha 值,则 alpha 会被合并。例如,将 50% 的 alpha 应用于 50% 的不透明白色中,将产生 25% 的白色:

<selector …  <item android:alpha="0.50" android:color="#80ffffff" />selector>
因此,最好将主题背景颜色指定为完全不透明,然后使用 ColorStateLists 修改它们的 alpha。2. 仅在 API 23 中添加了 alpha 组件,因此,如果您的最小 sdk 低于这个版本,请确保使用支持此行为的 AppCompatResources.getColorStateList (并始终使用 android:alpha 命名空间,而绝不使用 app:alpha 命名空间)。
  • AppCompatResources.getColorStateListhttps://developer.android.google.cn/reference/androidx/appcompat/content/res/AppCompatResources.html#getColorStateList(android.content.Context,%20int)
3. 通常,我们使用简写法,将颜色设置为 Drawable,例如:
<View …  android:background="@color/foo"/>
View 的背景是一个 Drawable,此简写把给定的颜色强转成了一个 ColorDrawable。但是没有办法把 ColorStateList 转换成 Drawable (API 29 之前使用 ColorStateListDrawable 解决这个问题)。
  • ColorDrawablehttps://developer.android.google.cn/reference/android/graphics/drawable/ColorDrawable
  • ColorStateListDrawablehttps://developer.android.google.cn/reference/android/graphics/drawable/ColorStateListDrawable
但是,我们可以通过迂回的方式绕过此限制:
<View …  android:background="@drawable/a_solid_white_rectangle_shape_drawable"  app:backgroundTint="@color/some_color_state_list"/>
请确保您的 backgroundTint 支持您的 View 所需的状态,例如,如果被禁用时需要更改。

强制执行

即使您已经说服自己使用主题背景属性和 ColorStateList,但如何在代码库或者团队中使用呢?您可以在 Code review 期间尝试保持警惕,但它的扩展性不是很好。更好的方法是依靠工具来解决此问题。《Making Android Lint Theme Aware》这篇文章简述了如何通过添加 Lint 检查来寻找直接引用颜色的用法,并涵盖了文中提及到的所有建议。
  • 《Making Android Lint Theme Aware》

    https://proandroiddev.com/making-android-lint-theme-aware-6285737b13bc

间接使用

使用主题背景属性和 ColorStateList 将颜色分解为主题背景的方法,可使您的布局和样式更加灵活,提高代码复用性并保持代码库的精简和易维护性。我们将在后续文章中介绍更多主题背景的用法以及它们之间的相互影响,感兴趣的读者请继续关注。4d73c90dbb9fb0dfbdd612bfa95b2891.png

推荐阅读

463a5007dffc4748f2a7f39db6deb933.png7e002f0d383cb437c7146c608c6fbc76.pngc52e2695245ad17fbc71ad2525ef6466.png4168872c792ffc71a2b064955aabbb43.gif 点击屏末  | 了解更多与 Android 界面相关的内容和教程

cbc71b2b1cf37ab4c53f41f954710550.png

ea4e9222bf72b2e4bcff964bf5963c67.gif

a0eb9aef2ebbdf2b4b4bbc6f7714bdff.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python二级考试可以用pycharm吗_学Python,Pycharm不能不知道怎么用

栏目介绍必会的Pycharm。我决定把去年写的Python文章整理一个专栏&#xff0c;垃圾的就直接删除&#xff0c;将多篇博文整理成一篇。 工欲善其事必先利其器&#xff0c;Pycharm 是最受欢迎的Python开发工具&#xff0c;它提供的功能非常强大&#xff0c;我尽量把自己用的都写写…

apache camel_Apache Camel Intellij IDEA插件的工作已开始

apache camel仅仅因为圣诞节并不意味着骆驼静止不动。 在23日晚上&#xff0c;我花了一些时间进行研究&#xff0c;并开始研究IDEA的Apache Camel插件的小原型。 它已经存在了我很长时间。 原因是Apache Camel为目录提供了有关工具的大量有用信息。 该目录包含有关每个Camel组…

Final Cut Pro X剪辑影片基本步骤

文章目录一、资源库、事件、项目之间的区别二、制作一个视频的步骤&#xff08;一&#xff09;创建资源库&#xff08;二&#xff09;创建事件(非必需)&#xff08;三&#xff09;导入资源&#xff08;四&#xff09;创建项目&#xff08;五&#xff09;进行剪辑&#xff08;六…

单例模式引发的内存泄漏:_资源泄漏:救援的命令模式

单例模式引发的内存泄漏:多年来&#xff0c; 使用Plumbr进行性能监控时&#xff0c;我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中&#xff0c;我想描述一种最简单的方法来清理资源并避免该问题。 首先&#xff0c;我以电影播放器​​应用程序为例来描述问题。 这种应…

ant构建项目迁移到gradle_Gradle这么弱还跑来面腾讯?

点击上方“刘望舒”&#xff0c;选择“星标”多点在看&#xff0c;就是真爱作者: 厘米姑娘(腾讯开发妹子)| 来源 &#xff1a;公号 码个蛋https://www.jianshu.com/p/1274c1f1b6a4前言在使用Android Studio过程中没少被Gradle坑过&#xff0c;虽然网上有很多简单粗暴的解决方案…

java heroku_使用Spring Boot和Heroku在20分钟内完成Java的单点登录

java heroku建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 大规模更新 我最初为本文…

如何使用SSH客户端远程操作linux系统,并启动、关闭tomcat和查看后台日志

cd … 表示回退到上一级目录 ls 表示查看当前目录下的所有文件 我们的tomcat安装路径在usr\local\yzmis\下面找 例如你要关闭信誉质量考核系统所在的tomcat&#xff0c;你要进入test下去找到apache-tomcat-6.0.14 再进入bin目录下&#xff0c;然后执行[trserver100 bin]$ ./sh…

模块pdf2image.dll加载失败_Webpack 原理从前端模块化开始

当前主流 JS 模块化方案无模块化CommonJS 规范&#xff0c;nodejs 实现的规范AMD 规范&#xff0c;requirejs 实现的规范CMD 规范&#xff0c;seajs 实现的规范&#xff0c; seajs 与 requirejs 实现原理有很多相似的地方 u ES Modules&#xff0c;当前 js 标准模块化方案注意:…

ios html正则表达式,ios 正则表达式去html标签

ios 正则表达式去html标签[2021-01-27 12:53:55] 简介:php正则表达式去掉html的方法&#xff1a;首先使用“htmlspecialchars_decode” 将特殊的HTML实体转换回普通字符&#xff1b;然后通过正则表达式“preg_replace(/]>/,,$_st系统运维正则表达式概述基础正则表达式扩展正…

java开发五年面试经验_只有经验丰富的开发人员才能教您有关Java的5件事

java开发五年面试经验深入研究Java之前需要了解的所有内容的概述 有许多工具&#xff0c;方法&#xff0c;环境和功能会改变您处理代码的方式&#xff0c;而这些通常是在学年期间不会遇到的。 虽然它在Java开发世界中迈出了第一步&#xff0c;但大多数实际学习都是在工作中进行…

c++调用cplex求解例子_视频教程 | 用Python玩转运筹优化求解器IBM CPLEX(二)

编者按优化求解器对于做运筹学应用的学生来说&#xff0c;意义重大。然而直到今天&#xff0c;放眼望去&#xff0c;全网&#xff08;包括墙外&#xff09;几乎没有一个系统的Cplex中文求解器教程。作为华人运筹学的最大的社区&#xff0c;『运筹OR帷幄』 责无旁贷&#xff0c;…

markdown 行内公式_如何轻松将笔记转为思维导图(Word、Markdown)

目录简介Markdown -> XMindWord -> XMind简介思维导图是一种一种图像式思维的工具&#xff0c;便于我们理解知识之间的逻辑关系。在我们的学习、生活中&#xff0c;我们习惯于使用word、markdown等笔记软件&#xff0c;而较少的使用思维导图。其实&#xff0c;有些时候我…

apache.camel_Apache Camel 2.18发布–包含内容

apache.camel本周发布了Apache Camel 2.18.0 。 此版本是重要版本&#xff0c;我将在此博客文章中重点介绍。 Java 8 Camel 2.18是第一个需要Java 1.8的版本&#xff08;例如&#xff0c;容易记住的Camel 2.18 Java1.8。Camel2.17 Java 1.7&#xff09;。 我们采取了谨慎的…

cors跨域_Spring Boot 中通过 CORS 解决跨域问题

(给ImportNew加星标&#xff0c;提高Java技能)转自&#xff1a;江南一点雨今天和小伙伴们来聊一聊通过CORS解决跨域问题。同源策略很多人对跨域有一种误解&#xff0c;以为这是前端的事&#xff0c;和后端没关系&#xff0c;其实不是这样的&#xff0c;说到跨域&#xff0c;就不…

逻辑建模与物理建模_架构层和建模域逻辑

逻辑建模与物理建模在讨论用于建模域逻辑&#xff08;例如事务脚本&#xff0c;表模块&#xff0c;域模型&#xff09;的PoEAA模式时&#xff0c;我注意到人们对域模型模式是最好的印象&#xff08;尽管印象不对&#xff09;。 因此&#xff0c;他们开始将其应用于所有内容。 …

html文字列表,文字列表模板

文字列表模板1、如何编辑列表模板文字列表模板存放在模板包archive文件夹中&#xff0c;命名以list_text为前缀在模板包中找到list_text.html 模板&#xff0c;复制另存为一个新模板&#xff0c;命名为list_text_自定义名称.html自定义名称可以是英文或拼音&#xff0c;但不能用…

inputstreamreader未关闭会导致oom_Linux内核OOM机制分析和防止进程被OOM杀死的方法...

问题描述Linux 内核有个机制叫 OOM killer(Out-Of-Memory killer)&#xff0c;该机制会监控那些占用内存过大&#xff0c;尤其是瞬间很快消耗大量内存的进程&#xff0c;为了防止内存耗尽而内核会把该进程杀掉。典型的情况是&#xff1a;某天一台机器突然 ssh 远程登录不了&…

centos一键清理磁盘空间_如何清理 Docker 占用的磁盘空间

Docker 很占用空间&#xff0c;每当我们运行容器、拉取镜像、部署应用、构建自己的镜像时&#xff0c;我们的磁盘空间会被大量占用。如果你也被这个问题所困扰&#xff0c;咱们就一起看一下 Docker 是如何使用磁盘空间的&#xff0c;以及如何回收。docker 占用的空间可以通过下…

mongodb dsl_具有Java DSL的Spring Integration MongoDB适配器

mongodb dsl1引言 这篇文章解释了如何使用Spring Integration从MongoDB数据库中保存和检索实体。 为了完成此任务&#xff0c;我们将使用Java DSL配置扩展来配置入站和出站MongoDB通道适配器。 例如&#xff0c;我们将构建一个应用程序&#xff0c;使您可以将订单写入MongoDB存…

Oracle 数据库中较为复杂或典型的 SQL 语句的解读

文章目录批量生成 SQL 语句/拼接字符串多表关联查询 where 子句示例&#xff08;一&#xff09;示例&#xff08;二&#xff09;普通的表间内连接查询语句关键字 distinct 用法说明Oracle 数据库的分组排序查询Oracle 数据库 cast 函数Oracle 数据库 sum 函数的高级用法Oracle…