Android的styles资源文件中存在了我们在应用中定义的各种style,它们都是以style开始的元素,包含许多属性的集合。但我们一般般它们分为style和theme,那它们有什么区别呢?

一、Style or Theme

what

  theme是一种特殊的style,我们通常认为style是运用在一个view或者window上,而theme是运用在activity或者application上的。style在布局文件中通过style=@style/[style name]引入,注意这里没有名字空间前缀;theme通过android:theme=@style/[style name]。
  有一个很重要的特性来区别使用style还是theme,通过style=@style/[style name]映入style元素的作用域仅仅是映入的view本身,不包含它的子view;但是通过android:theme映入的style元素会作用域它的子view。
  其实也很好理解这个区别,style是“样式”的意思,它指单个元素的的样式;而theme是“主题”,主题是整体概念,所以它会影响元素及元素的子元素。

why

为什么需要style?style的目的有两个(个人总结,不一定全面):

  • 提取公共属性项,减少代码量。
  • 维护界面外观的整体性,使得应用界面风格的一致性。

二、Definition of style

  theme和style的格式是相同的,不同的在于他们的作用对象和作用域不同。那么下面就来讲讲如何定义一个style

where

  style必须定义在value目录下的styles文件中,该文件是xml格式,根元素是resource,在resource内部可以定义自己的style。style的定义位置如下:

<resources>

   <style name="AppTheme"
parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style> <style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style> </resources>

how

  style的定义中name的必须要写的,它表明了这个style的名字,也是使用该style时的唯一身份标签:R.style.[name]
接着是可选的parent字段,style允许类似于Java的基础机制,它可以继承parent什么的style的全部属性,然后自己覆盖原属性或者增加新属性,
很大程度上减少了代码量。继承的表示还有另外一种方式:

<!--继承自己写的style-->
<style name="AppTheme.NoActionBar">
...
</style>
<!--通用继承方式-->
<style name="AppTheme" parent="Theme.AppCompat.Light">
...
</style>

如上所示,第一种继承方式只适用于同一个文件中的多个style的继承关系,后一种可以继承来自android预定义的style和同文件中的style。

use

  一个定义好的style,可以两种方式使用。

  • 通过android:theme="@style/name"引入一个activity或者application或者其他需要元素;
  • 通过布局文件中style="@style/[name]"引入。

最后style也可以通过后缀文件来适配不同的设备,这点就不提了。

最新文章

  1. MVC中在RAZOR 模板里突然了现了 CANNOT RESOLVE SYMBOL ‘VIEWBAG’ 的错误提示
  2. Hibernate连接数据库超时设置autoReconnect=true
  3. 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099;
  4. PHP AJAX上传文件
  5. 20145213 《Java程序设计》实验四 Android开发基础
  6. 介绍开源的.net通信框架NetworkComms框架 源码分析(十五 ) CommsThreadPool自定义线程池
  7. sql语句练习50题
  8. WCF note1
  9. POJ 3301 Texas Trip (三分)
  10. 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动
  11. rebuild过程
  12. MongoDB自学(2)
  13. Springboot @Transactional Mysql事务 无效
  14. [Swift]LeetCode437. 路径总和 III | Path Sum III
  15. 记录一下,PC端vue开发常用框架,已经用过elementUI和iview 接下来尝试另一个Muse-UI 喜欢它的点击效果
  16. 线程中的current thread not owner异常错误
  17. (栈)leetcode 946. Validate Stack Sequences
  18. 【转】asp.net Core 系列【一】——创建Web应用
  19. Missing library: xdoclet-1.2.1.jar.如何解决?
  20. 20145319 《网络渗透》MS08_067安全漏洞

热门文章

  1. ITFriend创业败局(四):菜鸟CEO的自我修养
  2. 利用WPF建立自己的3d gis软件(非axhost方式)(一)
  3. Linux input
  4. vue-router设置页面标题
  5. centos 7 构造iptables开放80port
  6. σ 代数与测度(measures)
  7. 学习vi和vim编辑(4):高速移动定位
  8. Visual C# 2010 实现资源管理器
  9. AutoEncoder一些实验结果,并考虑
  10. matlab 深度学习