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

news2025/1/16 21:03:42

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属性

<TextView
    style="@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.coloradmin.cn/o/44754.html

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

相关文章

【仿牛客网笔记】项目发布与总结——单元测试、项目监控

在项目上线之前需做好单元测试&#xff0c;平时开发的过程中&#xff0c;每个功能也需要进行单元测试。 验证注解的作用&#xff0c;注解是修饰方法的。 每次调方法都是静态的 对test1和test2分别进行运行 通过类进行运行&#xff0c;运行所有的方法 测试帖子的Service&#x…

【序列召回推荐】(task5)多兴趣召回Comirec-DR

note&#xff1a; 多兴趣召回建模。Comirec论文中的提出的第一个模型&#xff1a;Comirec-DR&#xff08;DR就是dynamic routing&#xff09;&#xff0c;阿里将用户行为序列的item embeddings作为初始的capsule&#xff0c;然后提取出多个兴趣capsules&#xff0c;即为用户的…

【Java】博客系统——详细解释+代码+详细注释(课设必过)

目录 前言 博客系统简要分析 一、数据库的设计 1.1 分析 1.2 代码实现&#xff08;创建数据库和表&#xff09; 二、封装数据库&#xff08;JDBC代码的编写&#xff09; 2.1、首先通过创建Maven项目&#xff0c;基于Small Tomcat部署 servlet&#xff1b; 2.2、封装数据…

telnet配置设备远程管理—eNSP

案例&#xff1a;给路由器配置远程管理&#xff0c;使一台路由器远程管理另一台。 所需设备&#xff1a;两台路由器&#xff0c;一根网线 图示 一、给两台设备配置IP地址 AR1&#xff08;以下命令&#xff09; a. sy b. int g0/0/0 c. ip add 1.1.1.1 24AR2 a. sy b. int g0/0…

区间信息维护与查询【线段树 】 - 原理1 线段树的基本操作

区间信息维护与查询【线段树 】 - 原理1 线段树的基本操作 线段树&#xff08;segment tree&#xff09;是一种基于分治思想的二叉树&#xff0c;它的每个节点都对应一个[L , R ]区间&#xff0c;叶子节点对应的区间L R 。每一个非叶子节点[L , R ]其左子节点的区间都为[L , (…

进程与线程的区别及联系

目录 1. 操作系统功能简介 2. 进程 2.1 认识进程 2.2 进程操作系统中如何管理 2.3 PCB如何描述 2.3.1 pid 2.3.2 内存指针 2.3.3 文件描述符表 2.3.4 进程调度相关属性 3. 内存管理 4. 线程 4.1 认识线程 4.2 进程与线程的关系 4.3 线程安全问题 1.操作系统功能简…

[附源码]计算机毕业设计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…

Git 入门 拉取仓库和推送仓库

目录 基本操作 本地建立仓库并推送到远端仓库 关联仓库失败 解决方法 从远端仓库拉取文件到本地 私有的仓库的连接 修改 提交者名称 IDEA/Pycharm等如何使用git 如何关闭git 功能 Git操作主要分为两类 &#xff0c;如何把自己建的项目同步的网上的仓库&#xff0c;如何…

OpenHarmony编译系统

GN 简介 直接百度 GN 入门 可以参考下面的示例&#xff0c;作为入门参考学习https://blog.csdn.net/weixin_44701535/article/details/88355958https://gn.googlesource.com/gn//main/docs/reference.mdhttps://chromium.googlesource.com/chromium/src/tools/gn//48062805e…

Java项目_在线点餐系统(jsp+sevlet+mysql)(含论文)

在线点餐系统(jspsevletmysql一、系统介绍二、功能展示1.主页(用户)2.菜单(用户)3.用户注册(用户)4.用户登陆(用户)5.我的订单(用户)6.餐桌管理(管理员)7.菜系管理(管理员)8.菜品管理(管理员)9.订单管理(管理员)三、获取源码一、系统介绍 系统主要功能&#xff1a; 用户&#…

4位资深专家多年大厂经验分享出Flink技术架构设计与实现原理

时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

bootstrap下拉菜单学习(五)

组件&#xff1a;下拉菜单 bootstrap字体图标和下拉菜单组件的使用 这些图标都存在我们引入的font文件夹内&#xff1a; 复制bootstrap所用的包&#xff1a; 创建html页面&#xff1a; 图标不仅可以直接放文本里面&#xff0c; 还可有结合按钮去用。 要使用组件&#xff1a;不…

《网络空间测绘技术与实践》正式发售,让网络空间作战“有图可依”

近日&#xff0c;多位业界专家力推&#xff0c;由知道创宇CEO赵伟、CTO杨冀龙、CSO黑哥&#xff08;周景平&#xff09;等撰写的著作《网络空间测绘技术与实践》&#xff0c;正式出版并发售。网络空间已成为继“陆、 海、空、天”后的第五大空间&#xff0c;网络空间亦需要类似…

【uni-app高频面试题——精品一】

uni-app高频面试题谈谈你对uni-app的理解&#x1f355;uni中如何为不同的平台设置不同的代码uniapp中封装接口请求相较于微信小程序有什么要注意的uni-app中的本地存储数据和接收数据是什么✊uni-app 路由与页面跳转&#x1f4aa;uni-app全局变量怎么定义&#xff0c;怎么获取&…

【Python实战】“特种兵”们的专属游戏助手,助你吃鸡:极品小助手也是棒呆了~(“大吉大利,今W吃鸡”)

前言 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 “注意左边&#xff0c;左边有人&#xff0c;打他&#xff01;” “快上车&#xff01;&#xff0…

Spring Security(十九)--OAuth2:实现授权服务器(下)--环境准备以及骨架代码搭建

一、前言 本章我们将在上一章代码骨架搭建好的前提下对三种授权类型进行测试以及讲解如何配置授权服务器以颁发刷新令牌&#xff0c;所以本章是一个比较轻松的章节&#xff0c;但是唯一的要求就是需要小伙伴们对上一章内容要完成代码的搭建&#xff0c;否则这章学习也不知道个…

[附源码]计算机毕业设计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…

嘉创房地产冲刺港交所:半年营收4.7亿 现金及现金等价物减少

雷递网 雷建平 11月28日嘉创房地产控股有限公司&#xff08;简称&#xff1a;“嘉创”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。半年营收4.73亿嘉创为一家精品住宅物业发展商&#xff0c;主要在大湾区的东莞、惠州及佛山迅速发展的住宅市场&#xff08;如东莞…

m半分布式JAC联合接纳控制与用户位置信息的垂直切换matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着无线通信技术的飞速发展&#xff0c;为支持多种不同无线接入技术、不同系统间协作、不同业务类型及终端差异性等需求&#xff0c;未来的无线网络将是一种协作式的异构网络融合架构&#xff0…

文理导航杂志文理导航杂志社文理导航编辑部2022年第12期目录

专题研究《文理导航》投稿&#xff1a;cn7kantougao163.com 初中科学生活化作业优化策略 唐黎娜; 4-6 揭密2022年新高考1卷解析几何解答题 陈思伽; 7-9 初中数学错题资源的有效运用 王丹; 10-12 浅谈陶行知思想在初中体育教学中的应用 王树华; 13-15 高中数…