样式和主题背景 | Android 开发者 | Android Developers
类似web设计中css样式。将应用设计的细节与界面的结构和行为分开。
样式style :应用于 单个 View
的外观。样式可以指定字体颜色、字号、背景颜色等属性
主题theme: 虽然他可以像style一样应用于某个view,但规范使用的话还是在整个app、 单独的activity 、某个视图层次结构layout
样式style和主题theme在 res/values/
中的样式资源文件中声明,该文件通常命名为 styles.xml
。当然我们可以根据功能使用不同,多创建几个styles.xml。比如themes.xml,app_style.xml
主题背景定义具名资源的集合,可由样式、布局、微件等引用。主题背景为 Android 资源分配语义名称,例如 colorPrimary
。
样式和主题背景应当配合使用。例如,您可以用一个样式指定按钮的一部分应为 colorPrimary
颜色,另一个部分应为 colorSecondary
颜色,而这些颜色的实际定义则在主题背景中提供。当设备进入夜间模式时,您的应用可以从“浅色”主题背景切换为“深色”主题背景,从而更改所有这些资源名称的值。您无需更改样式,因为样式使用的是语义名称而非具体的颜色定义。
style属性
android:theme
不过,您通常不会将样式应用于单个视图,而是会将样式作为主题应用于整个应用、Activity 或视图集合。
为保持与平台界面样式的兼容性,您应始终通过扩展框架或支持库中的现有样式来创建自己的样式。如需扩展样式,请使用 parent
属性指定要扩展的样式。然后,您可以替换继承的样式属性并添加新属性。
例如
当然上述做法其实并不规范,官方建议我们直接继承 支持库中的样式(已定义好相关的style)。
不过,您应始终继承 Android 支持库中的核心应用样式。为与 Android 4.0(API 级别 14)及更高版本兼容,支持库中的样式会针对各版本中可用的界面属性进行优化。支持库中的样式通常与平台中的样式具有相似的名称,但包含 AppCompat
。
如需从库或您自己的项目继承样式,请声明父样式名称,但不要包含以上示例中所示的 @android:style/
部分。例如,以下示例继承了支持库中的文本外观样式:
如果跟进下代码,会发现 父TextAppearance.AppCompat 中已经引用了 @android:style/TextAppearance
可以参考官方 支持库中命名方式就是这样的
您也可以使用点分表示法(而非 parent
属性)来扩展样式名称,从而继承样式(平台中的样式除外)。也就是说,将您想继承的样式的名称附加在您的样式的名称前面并用句点分隔。这种方式通常仅适合用来扩展您自己的样式,而不适合用来扩展其他库中的样式。例如,以下样式从上面的 GreenText
样式继承了所有样式,然后增加了文本大小:
Android 提供了多种在整个 Android 应用中设置属性的方法。例如,您可以直接在布局中设置属性,将样式应用到视图,将主题背景应用到布局,以及以编程方式设置属性。
在选择如何为应用设置样式时,需考虑 Android 的样式层次结构。一般来说,您应当尽量使用主题背景和样式,以保持一致性。如果您在多个位置指定了相同的属性,下面的列表将决定最终应用哪些属性。该列表按照优先级从高到低的顺序排序:
TextView
派生的类TextView
设置 TextAppearance
App Bar 的背景色,即 ActionBar,通常也是一个 App 的主题色调。不过 ActionBar 已经退出历史舞台,由 Toolbar 代替使用,但是 Toolbar 需要在 layout 文件中单独使用 background 属性设置背景色
status bar(状态栏)背景色。仅作用于 Lollipop 及更高版本。
许多控件在选中状态或获取焦点状态下使用这个颜色,常见有:
CheckBox:checked 状态
RadioButton:checked 状态
SwitchCompat:checked 状态
EditText:获取焦点时的 underline 和 cursor 颜色
TextInputLayout:悬浮 label 字体颜色
navigation bar 背景色。仅作用于 Lollipop 及更高版本。
某些 Views “normal” 状态下的颜色,常见如:unselected CheckBox 和 RadioButton,失去焦点时的 EditText,Toolbar 溢出按钮颜色,等等。
某种程度上,是 colorAccent 的替代者,比如对于 CheckBox 和 RadioButton 的 checked 状态,colorControlActivated 属性会覆盖 colorAccent 属性的对应颜色。
所有可点击 Views 触摸状态下的 Ripple(涟漪)效果。仅作用于 Lollipop 及更高版本。
Button normal 状态下的背景色。注意,这种设置与 Button 的 android:background 属性改变背景色不同的是,前者在 Lollipop 及更高版本上会让 Button 依旧保持阴影和 Ripple 触摸效果。
窗口背景色,诸如此类的还有:android:background,android:colorBackground 等。
EditText 的 text color,等等文本颜色。
定义toolbar上统一的返回按钮的图片
在Android界面上以上主题色对应使用位置下面两个图展示
根据各自项目采用的SDK版本不同,主题可以也有不同之处。大概源码如下