正确使用 Android 的 Theme 和 Style
原文:http://www.tuicool.com/articles/ZjEZFj
Android 5.0 可以给一个 View 单独设置一个 theme 了,其主要用途就是用在 ToolBar 上, 比如 当前使用白色主题但是想使用黑色的 ToolBar ,
只要在 ToolBar 的 xml 文件 中添加 android:theme=”@android:style/ThemeOverlay.Material.Dark.ActionBar” 即可。
<Toolbar
android:layout_height="?android:attr/actionBarSize"
android:layout_width="match_parent"
android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar" />
该功能在 5.0 之前也存在,只是无法单独在 View 上设置而已,比如 5.0之前的 Theme.Holo.Light.DarkActionBar 主题,就是白色主题但是 ActionBar 是黑色。这种底层实现方式是通过一个 actionBarWidgetTheme 来引入一个新的主题。
<style name="Theme.Holo.Light.DarkActionBar">
<item name="android:actionBarWidgetTheme">@android:style/Theme.Holo</item>
</style>
底层实现细节
底层是通过 ContextThemeWrapper 类实现的,顾名思义该类所做的工作就是在当前 context 上装饰另外一个 theme,来覆盖(改变)一些控件的属性。
因此,在 5.0 中又引入了一种新的 theme – ThemeOverlay ,主要有这么两种:
- ThemeOverlay.Material.Light
- ThemeOverlay.Material.Dark
分别为 白色 和黑色的。把这两个 theme 装饰到 Theme.Material 上来修改部分的样式为白色或者黑色。同样,对于特殊的 ActionBar 而言,也有两个衍生出来的 ThemeOverlay theme:
- ThemeOverlay.Material.Light.ActionBar
- ThemeOverlay.Material.Dark.ActionBar
这两个 theme 应该只使用在 5.0 的新 属性 actionBarTheme 或者 Toolbar 上(上面的 xml 代码示例)。 这两个 theme 目前只是把 colorControlNormal 修改为 android:textColorPrimary 的值并把所有的文字和图标都设置为不透明的。
android:theme
android:theme 是 5.0 中新添加到 View 上的属性。需要注意的是, 该属性会传递给所有子控件,例如:
<LinearLayout
android:theme="@android:style/ThemeOverlay.Material.Dark">
<!--这里面的所有 view 都会使用 ThemeOverlay.Material.Dark theme,除非你在单独给某个 view 设置一个新的 theme 属性 -->
</LinearLayout>
5.0 还引入了一个新的 theme 属性: colorEdgeEffect ,该属性可以定制一个 View 过度滑动的(颜色)效果, 通过上面的 方式可以很容易的修改一个 View 的 过度滑动效果;
由于这是一个 theme 里面的 属性,所以无法直接应用到 View 上,我们可以自定义一个 Overlay theme, 在里面设置 colorEdgeEffect 的值,然后在 View 上通过 android:theme 属性来设置这个自定义的 theme 即可。
自定义theme res/values/themes.xml
<style name=”RedThemeOverlay” parent=”android:ThemeOverlay.Material”>
<item name=”android:colorEdgeEffect”>#FF0000</item>
</style>
然后把该 theme 设置到 view 上:
<ListView … android:theme=”RedThemeOverlay” />
通过上面同样的方式,您可以自定义所有 theme 里面的属性。
Theme VS Style
那么问题来了, Theme 和 Style 到底有啥区别呢? 他们的定义方式是一模一样的,只是使用的地方不一样而已。
Theme 是用来设置应用全局 主题风格的, 5.0 上可以让你局部的调整设计风格;
而 Style 主要是用在 View 上的,当你在 view 上设置 style 的时候,LayoutInflater 会读取 该 style 的内容并在任意单独设置的样式之前把该内容设置到 AttributeSet 中。
总结起来就是: Theme 是全局的;Style 是局部的。
需要注意的是,如果您使用 AppCompat V21 的话,当前 AppCompat 只能在android.support.v7.widget.Toolbar 上使用 Theme 属性。
正确使用 Android 的 Theme 和 Style的更多相关文章
- android 中theme和style的语法相关
1.theme和style都是一组属性的集合,用于定义文本.颜色.大小等显示风格.他们都是资源,可以用android系统级别的一些默认的风格和主题资源,你也可以自定义你自己的主题和风格资源. 2.自定 ...
- Android开发之Theme、Style探索及源码浅析
1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...
- Android 样式和主题(style & theme)
Android 样式 android中的样式和CSS样式作用相似,都是用于为界面元素定义显示风格,它是一个包含一个或者多个view控件属性的集合.如:需要定义字体的颜色和大小. 在CSS中是这样定义的 ...
- Android主题theme和风格style总结
用到了Android的主题和风格,感觉很多地方需要总结和记录下来.其实主题和风格是有很大的作用的,特别是界面要求比较高的客户端. Style:是一个包含一种或者多种格式化属性的集合,我们可以将其用为一 ...
- Android中theme.xml与style.xml的区别
一.相同点 两者的定义相同.继承方式也相同 <?xml version="1.0" encoding="utf-8"?> <resources ...
- Android 避免APP启动闪黑屏的解决办法(Theme和Style)
前几天Boss就反应说,机器每次启动程序都会闪一下黑屏,这个客户不接受.没办法,只能想想怎么解决,最后找到了下面的方法.闪黑屏的原因主要是我们启动Activity的时候,需要跑完onCreate和on ...
- android UI进阶之style和theme的使用
今天来和大家分享一下android中UI设计里面常会用到的style和theme. 首先,style和theme都是资源,android提供了很多这样的默认资源.你可以来使用它们.同时你也可以自己定义 ...
- 【转】Android 避免APP启动闪黑屏(Theme和Style)
前几天Boss就反应说,机器每次启动程序都会闪一下黑屏,这个客户不接受.没办法,只能想想怎么解决,最后找到了下面的方法.闪黑屏的原因主要是我们启动Activity的时候,需要跑完onCreate和on ...
- android学习之-Theme和Style
android学习之-Theme和Style 分类: android 2013-10-11 15:01 960人阅读 评论(0) 收藏 举报 android style和theme的使用. style ...
随机推荐
- Win10-IIS注册asp 此操作系统版本不支持此选项 错误解决方法
现象再现: 今日在Win10上面ASP.NET网站突然不能跑了, 过程再现: 根据资料提示重新注册ASPNET_IIS.exe -i 直接提示: C:\WINDOWS\system32>c:\w ...
- Spring Cloud Alibaba 实战 之 Nacos 服务注册和发现
服务注册与发现,服务发现主要用于实现各个微服务实例的自动化注册与发现,是微服务治理的核心,学习 Spring Cloud Alibaba,首先要了解框架中的服务注册和发现组件——Nacos. 一.Sp ...
- Django - 在settings配置终端打印SQL语句
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DE ...
- 压缩和解压工具bandizip
同质化的压缩软件 提及 Windows 平台的压缩软件,大家往往想起老牌的 WinRAR.开源免费的 7-Zip.国产的快压.好压.360 压缩之类,甚至还有时代的眼泪 WinZip.一直以来,压缩软 ...
- python pylab.plot() 方法使用
Python 中用pylab模块, pylab.plot() 函数,绘制折线统计图 import pylab as pl x = [, , , ] y = [, , , ] ''' plot参数说明: ...
- oracle 基础sql语句
修改date日期时间: update T2_FOODS_STORAGE_IN set create_time =to_date('2020-01-15 12:30:20','yyyy-mm-dd hh ...
- 极简的js点击组图切换效果
程序员进行前端开发时,时常要用到点击切换组图的动画效果,网上确实有很多此类插件,但是都很麻烦,乌糟糟无数代码,有那个看的时间,自己都能把功能写完了.在这里我提供一段极简的js点击组图切换效果代码,包含 ...
- 三星前有note7,现有GalaxyS10,爆炸原因外力?
编辑 | 于斌 出品 | 于见(mpyujian) 提到三星,不知道大家什么感觉,反正首先映入脑海的是在Note 7系列爆炸中,三星就让中国消费者欲哭无泪的画面.而也正是三星的态度,三星手机在这件事情 ...
- 使用 yum 安装 MariaDB 与 MariaDB 的简单配置
1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB,两条命令都可以 systemctl sta ...
- 企业面试问题收集-java基础
Java基础部分 1.1 在登录时进行后台验证,后台获取到loginpass与数据库值对比一直? 1.2 Java中的方法覆盖(Overwrite)和方法重载(Overloading)是什么意 ...