Android——Theme和Style-由浅入深,全面讲解

news/2024/5/15 1:49:33/文章来源:https://blog.csdn.net/yilvqingtai/article/details/128065726

1、官方详细解读

样式和主题背景  |  Android 开发者  |  Android Developers

2、应用场景

类似web设计中css样式。将应用设计的细节与界面的结构和行为分开。

样式style :应用于 单个 View 的外观。样式可以指定字体颜色、字号、背景颜色等属性

主题theme: 虽然他可以像style一样应用于某个view,但规范使用的话还是在整个app、 单独的activity 、某个视图层次结构layout

3、声明位置

样式style和主题theme在 res/values/ 中的样式资源文件中声明,该文件通常命名为 styles.xml。当然我们可以根据功能使用不同,多创建几个styles.xml。比如themes.xml,app_style.xml

4、使用区别

4.1 theme使用通常Android 资源分配语义名称

主题背景定义具名资源的集合,可由样式、布局、微件等引用。主题背景为 Android 资源分配语义名称,例如 colorPrimary

4.2 theme和style结合使用(推荐)

样式和主题背景应当配合使用。例如,您可以用一个样式指定按钮的一部分应为 colorPrimary 颜色,另一个部分应为 colorSecondary 颜色,而这些颜色的实际定义则在主题背景中提供。当设备进入夜间模式时,您的应用可以从“浅色”主题背景切换为“深色”主题背景,从而更改所有这些资源名称的值。您无需更改样式,因为样式使用的是语义名称而非具体的颜色定义。

4.3 样式style详细使用

4.3.1 样式style使用

  • 1. 应用于独立view上 

style属性

<TextViewstyle="@style/GreenText"... />
  • 2. 应用于view及其所有子view上

 android:theme 

不过,您通常不会将样式应用于单个视图,而是会将样式作为主题应用于整个应用、Activity 或视图集合。

4.3.2 扩展和自定义样式style

  • 低级扩展方式

为保持与平台界面样式的兼容性,您应始终通过扩展框架或支持库中的现有样式来创建自己的样式。如需扩展样式,请使用 parent 属性指定要扩展的样式。然后,您可以替换继承的样式属性并添加新属性

例如

<style name="GreenText" parent="@android:style/TextAppearance"><item name="android:textColor">#00FF00</item>
</style>
  • 推荐扩展方式

当然上述做法其实并不规范,官方建议我们直接继承 支持库中的样式(已定义好相关的style)。

不过,您应始终继承 Android 支持库中的核心应用样式。为与 Android 4.0(API 级别 14)及更高版本兼容,支持库中的样式会针对各版本中可用的界面属性进行优化。支持库中的样式通常与平台中的样式具有相似的名称,但包含 AppCompat

如需从库或您自己的项目继承样式,请声明父样式名称,但不要包含以上示例中所示的 @android:style/ 部分。例如,以下示例继承了支持库中的文本外观样式:

<style name="GreenText" parent="TextAppearance.AppCompat"><item name="android:textColor">#00FF00</item>
</style>

如果跟进下代码,会发现 父TextAppearance.AppCompat 中已经引用了 @android:style/TextAppearance

 

 

  •  进阶扩展方式(点分表示法)

 可以参考官方 支持库中命名方式就是这样的

您也可以使用点分表示法(而非 parent 属性)来扩展样式名称,从而继承样式(平台中的样式除外)。也就是说,将您想继承的样式的名称附加在您的样式的名称前面并用句点分隔。这种方式通常仅适合用来扩展您自己的样式,而不适合用来扩展其他库中的样式。例如,以下样式从上面的 GreenText 样式继承了所有样式,然后增加了文本大小:

<style name="GreenText.Large"><item name="android:textSize">22dp</item>
</style>

4.3.3 样式style优先级顺序

Android 提供了多种在整个 Android 应用中设置属性的方法。例如,您可以直接在布局中设置属性,将样式应用到视图,将主题背景应用到布局,以及以编程方式设置属性。

在选择如何为应用设置样式时,需考虑 Android 的样式层次结构。一般来说,您应当尽量使用主题背景和样式,以保持一致性。如果您在多个位置指定了相同的属性,下面的列表将决定最终应用哪些属性。该列表按照优先级从高到低的顺序排序:

  1. 通过文本 span 将字符或段落级样式应用到 TextView 派生的类
  2. 以编程方式应用属性
  3. 将单独的属性直接应用到 View
  4. 将样式应用到 View
  5. 默认样式
  6. 将主题背景应用到 View 集合、Activity 或整个应用
  7. 应用某些特定于 View 的样式,例如为 TextView 设置 TextAppearance

4.4 主题theme详细使用

4.4.1 主题颜色详解

<style name="Base.Theme.GTD34GoldCoinAndroidProject" parent="Theme.Material3.Light.NoActionBar"><!-- Primary brand color. --><!-- 软件标题颜色 --><!--主色 应该是应用中出现最频繁的颜色--><item name="colorPrimary">@color/colorPrimary</item><!-- 主色对应深色主题 --><item name="colorPrimaryDark">@color/colorPrimaryDark</item><!-- 辅助色 --><item name="colorAccent">@color/colorPrimaryLight</item><!-- Status bar color. --><item name="android:statusBarColor">?attr/colorPrimary</item><!-- Customize your theme here. --><!-- The color applied to framework controls in their normal state. 控件正常状态颜色--><item name="colorControlNormal">@color/colorSecondaryGray2</item><!-- The color applied to framework controls in their activated (ex. checked) state.控件选中状态颜色 --><item name="colorControlActivated">@color/colorSecondaryPurple</item><!-- The color applied to framework control highlights (ex. ripples, list selectors). 控件高亮显示的颜色 --><item name="colorControlHighlight">@color/colorPrimaryLight</item><!-- The color applied to framework buttons in their normal state. 按钮正常状态颜色 --><item name="colorButtonNormal">@color/colorPrimary</item><!-- The color applied to framework switch thumbs in their normal state. 开关控件颜色 --><item name="colorSwitchThumbNormal">@color/colorPrimary</item><!-- The background used by framework controls.  控件背景色 --><item name="controlBackground">@color/colorPrimary</item><!-- Default color of background imagery for floating components, ex. dialogs, popups, and cards. 浮动组件(例如对话框、弹出窗口和卡片)的默认背景图像颜色 --><item name="colorBackgroundFloating">@color/colorSecondaryGray</item></style><style name="AppThemeDemo" parent="Theme.AppCompat.Light.DarkActionBar"><!-- 应用的主要色调,actionBar默认使用该颜色,Toolbar导航栏的底色 --><item name="colorPrimary">@color/white</item><!-- 应用的主要暗色调,statusBarColor 默认使用该颜色 --><item name="colorPrimaryDark">@color/white</item><!-- 一般控件的选中效果默认采用该颜色,如 CheckBox,RadioButton,SwitchCompat,ProcessBar等--><item name="colorAccent">@color/colorAccent</item><!-- 状态栏、顶部导航栏 相关--><!-- status bar color --><item name="android:statusBarColor">#00000000</item><!-- activity 是否能在status bar 底部绘制 --><item name="android:windowOverscan">true</item><!-- 让status bar透明,相当于statusBarColor=transparent + windowOverscan=true --><item name="android:windowTranslucentStatus">true</item><!-- 改变status bar 文字颜色, true黑色, false白色,API23可用--><item name="android:windowLightStatusBar">true</item><!-- 全屏显示,隐藏状态栏、导航栏、底部导航栏 --><item name="android:windowFullscreen">true</item><!-- hide title bar --><item name="windowNoTitle">true</item><!-- 底部虚拟导航栏颜色 --><item name="android:navigationBarColor">#E91E63</item><!-- 让底部导航栏变半透明灰色,覆盖在Activity之上(默认false,activity会居于底部导航栏顶部),如果设为true,navigationBarColor 失效 --><item name="android:windowTranslucentNavigation">true</item><!-- WindowBackground,可以设置@drawable,颜色引用(@color),不能设置颜色值(#fffffff),Window区域说明:Window涵盖整个屏幕显示区域,包括StatusBar的区域。当windowOverscan=false时,window的区域比Activity多出StatusBar,当windowOverscan=true时,window区域与Activity相同--><item name="android:windowBackground">@drawable/ic_launcher_background</item><!--<item name="android:windowBackground">@color/light_purple</item>--><!-- 控件相关 --><!-- button 文字是否全部大写(系统默认开)--><item name="android:textAllCaps">false</item><!-- 默认 Button,TextView的文字颜色 --><item name="android:textColor">#B0C4DE</item><!-- 默认 EditView 输入框字体的颜色 --><item name="android:editTextColor">#E6E6FA</item><!-- RadioButton checkbox等控件的文字 --><item name="android:textColorPrimaryDisableOnly">#1C71A9</item><!-- 应用的主要文字颜色,actionBar的标题文字默认使用该颜色 --><item name="android:textColorPrimary">#FFFFFF</item><!-- 辅助的文字颜色,一般比textColorPrimary的颜色弱一点,用于一些弱化的表示 --><item name="android:textColorSecondary">#C1C1C1</item><!-- 控件选中时的颜色,默认使用colorAccent --><item name="android:colorControlActivated">#FF7F50</item><!-- 控件按压时的色调--><item name="android:colorControlHighlight">#FF00FF</item><!-- CheckBox,RadioButton,SwitchCompat等默认状态的颜色 --><item name="android:colorControlNormal">#FFD700</item><!-- 默认按钮的背景颜色 --><item name="android:colorButtonNormal">#1C71A9</item><!-- 【无效】 在theme中设置Activity的属性无效, 请到AndroidManifest中Activity标签下设置 --><item name="android:launchMode">singleTop</item><item name="android:screenOrientation">landscape</item></style>
  • 1. colorPrimary

App Bar 的背景色,即 ActionBar,通常也是一个 App 的主题色调。不过 ActionBar 已经退出历史舞台,由 Toolbar 代替使用,但是 Toolbar 需要在 layout 文件中单独使用 background 属性设置背景色

  • 2. colorPrimaryDark

status bar(状态栏)背景色。仅作用于 Lollipop 及更高版本。

  • 3. colorAccent

许多控件在选中状态或获取焦点状态下使用这个颜色,常见有:

CheckBox:checked 状态

RadioButton:checked 状态

SwitchCompat:checked 状态

EditText:获取焦点时的 underline 和 cursor 颜色

TextInputLayout:悬浮 label 字体颜色

  • 4 android:navigationBarColor

navigation bar 背景色。仅作用于 Lollipop 及更高版本。

  • 5 colorControlNormal

某些 Views “normal” 状态下的颜色,常见如:unselected CheckBox 和 RadioButton,失去焦点时的 EditText,Toolbar 溢出按钮颜色,等等。

  • 6 colorControlActivated

某种程度上,是 colorAccent 的替代者,比如对于 CheckBox 和 RadioButton 的 checked 状态,colorControlActivated 属性会覆盖 colorAccent 属性的对应颜色。

  • 7 colorControlHighlight

所有可点击 Views 触摸状态下的 Ripple(涟漪)效果。仅作用于 Lollipop 及更高版本。

  • 8 colorButtonNormal

Button normal 状态下的背景色。注意,这种设置与 Button 的 android:background 属性改变背景色不同的是,前者在 Lollipop 及更高版本上会让 Button 依旧保持阴影和 Ripple 触摸效果。

  • 9 android:windowBackground

窗口背景色,诸如此类的还有:android:background,android:colorBackground 等。

  • 10 android:textColorPrimary

EditText 的 text color,等等文本颜色。

  • 11 navigationIcon

定义toolbar上统一的返回按钮的图片

在Android界面上以上主题色对应使用位置下面两个图展示

4.4.2 theme主题大全

4.4.3 深入官方SDK不同版本查看主题定义明细

根据各自项目采用的SDK版本不同,主题可以也有不同之处。大概源码如下

 

 参考:Android Theme 属性详解 - 简书

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

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

相关文章

[附源码]计算机毕业设计springboot动物保护协会网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用EL表达式时,PropertyNotFoundException异常的解决过程

一. 业务场景 最近&#xff0c;杨哥的一个班级正在做基于JSPJSTL/EL Servlet JavaBean JDBC MySQL技术方案的阶段项目。其中有一个需求是根据多条件动态搜索商品信息&#xff0c;最终分页显示出商品列表。这个功能可以在dao层采用多分支条件组合&#xff0c;显示页面使用JST…

[Linux](15)线程基础,线程控制,线程的互斥与同步

文章目录前言Linux 线程概念线程的优点线程的缺点线程异常线程用途使用pthread_createpthread_join线程退出线程id分离线程线程互斥问题&#xff1a;临界资源访问问题问题解决&#xff1a;互斥锁的使用RAII 风格的加锁方式可重入 & 线程安全死锁的概念线程同步条件变量生产…

C语言——指针(入门详解)

文章目录1.什么是指针&#xff1f;1.1.理解指针的两个要点&#xff1a;1.2.指针变量&#xff1a;1.3.内存是如何编址&#xff1f;2.指针和指针类型2.1指针的创建与初始化2.2.指针类型3.野指针3.1.什么视野指针&#xff1f;3.2.野指针成因3.3.规避野指针4.指针运算4.1.指针-整数…

【MySQL】数据库服务器硬件优化与实战详解(调优篇)(实战篇)(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

【一文秒懂——SLF4j日志】

目录 1. SLF4j日志 2. 日志输出 1. SLF4j日志 在添加了spring-boot-starter的项目中&#xff0c;已经包含了SLF4j日志的相关依赖项。 在添加了lombok的项目中&#xff0c;可以在类上添加Slf4j注解&#xff0c;则lombok框架会在编译期在类中声明名为log的变量&#xff0c;通…

2022Flink大数据比赛项目-焦点科技大数据编程大赛

文章目录0.数据获取1.需求概要2.数据标准2.1.输入数据格式2.2.输出数据格式2.3.数据主键及关系3.表详细1.order_info2.bill_info3.bill_item4.ord_pay5.ord_pay_log6.pay_method7.pay_bank_card4.开发工具、语言版本、工具版本5.赛题解答数据分流任务1任务2任务3小结附录0.数据…

聊聊雪花算法?

随便聊聊 哈喽&#xff0c;大家好&#xff0c;最近换了份工作&#xff0c;虽然后端技术栈是老了点&#xff0c;但是呢&#xff0c;这边的前端技术确是现在市面上最新的那一套技术&#xff1a;Vue3ViteTSXPinaElement-PlusNativeUI。我本人主要是学后端的&#xff0c;确被拉去做…

【博客545】从交换机视角看四种报文:广播、组播、未知单播、已知单播

从交换机视角看四种报文&#xff1a;广播、组播、未知单播、已知单播 交换机视角的四种报文 对于二层交换机来说&#xff0c;它在转发报文时&#xff0c;只有四种类型的报文&#xff1a; 1、广播 2、组播 3、未知单播 4、已知单播。四种报文剖析 1、二层广播报文 当二层交换…

SignalR简介及实践指南

SigalR简介 ASP.NET Core SignalR 是一个开放源代码库&#xff0c;可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。 适合 SignalR 的候选项&#xff1a; 需要从服务器进行高频率更新的应用。 示例包括游戏、社交网络、投票、拍卖…

易观千帆 | 2022年10月银行APP月活跃用户规模盘点

易观分析&#xff1a;易观千帆数据显示&#xff0c;10月手机银行服务应用活跃人数52285.79万&#xff0c;环比下降3.52%。手机银行服务应用月活规模经历了连续5个月的持续增长后&#xff0c;10月出现下降。 10月城商行手机银行服务应用活跃人数3565.56万&#xff0c;环比下降2…

UNIAPP实战项目笔记46 订单确认页面的布局

UNIAPP实战项目笔记46 订单确认页面的布局 实际案例图片 订单页面 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 代码 confirm-order.vue部分 confirm-order.vue 确认订单页面布局和渲染 flex 样式布局 <template>…

字符串5:剑指Offer58-II.左旋转字符串

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;344. 反转字符串 题目&#xff1a; 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个…

衡师11月月赛web题目wp

目录 1.丢三落四的学姐 2.wep&#xff1f;Pwn&#xff01;&#xff01;&#xff01; 这题web部分是buuctf中的DASCTF X GFCTF 2022十月挑战赛&#xff01;的原题 1.丢三落四的学姐 访问题目位置&#xff0c;很明显的phpstudy搭建的痕迹 访问一下经常信息泄露的几个文件&…

Baklib|知识库应用场景:制作员工培训手册

持续的专业发展对于想要加入、保留和提升员工的组织来说是必不可少的。为了确保员工总是能从学习能力中受益&#xff0c;您需要考虑创建培训手册&#xff0c;使员工能够胜任并保持他们的工作能力。 在过去&#xff0c;您可能认为培训手册是一本厚重的册子&#xff0c;充满了密…

一文彻底搞懂Mysql索引优化

专属小彩蛋&#xff1a;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff08;前言 - 床长人工智能教程&#xff09; 目录 一、索引介绍 二、性能分析 三、查询优化 一、索引介绍…

Oracle中ALTER TABLE的五种用法(三)

首发微信公众号&#xff1a;SQL数据库运维 原文链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzI1NTQyNzg3MQ&mid2247485212&idx1&sn450e9e94fa709b5eeff0de371c62072b&chksmea37536cdd40da7a94e165ce4b4c6e70fb1360d51bed4b3566eee438b587fa231315d0a5a…

通俗易懂的java设计模式(1)-单例模式

什么是单例模式&#xff1f; 单例模式是java中最简单的一种设计模式 需要注意的问题&#xff1a; 1.单例类有且只能有一个实例 2.单例类必须自己创建出这个实例&#xff0c;并提供给外界 那么如何自己创建实例而不让外界创建呢&#xff1f;很简单&#xff0c;我们将无参的构造函…

传输线理论基础01——相关定义、信号速率、分布参数与电报方程

前言一直以来都对高频信号、信号完整性、传输线、分布参数这些概念似懂非懂&#xff0c;上学时没学过相关课程&#xff0c;这导致我对高频电路和PCB理解较差&#xff0c;这里新开一个专栏&#xff0c;补齐这方面知识。 一. 传输线相关定义1.1 传输线定义 传输线指的是传输信号…

【Hack The Box】Linux练习-- Seventeen

HTB 学习笔记 【Hack The Box】Linux练习-- Seventeen &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f…