主题theme与风格style是两个很相近的概念,经常把它们混乱着称呼。它们都定义在xml文件中,都使用style标签。
主题与风格是包含与被包含的关系。例如同一个主题中,按钮使用一种风格,进度条使用一种风格。可以说主题是由具备各种风格的组件组合起来的。
从下面定义的主题例子中,我们可以看到
文字
,使用的是TextAppearance.DeviceDefault
风格;按钮
,使用的是Widget.DeviceDefault.Button
风格;窗口标题
,使用的是WindowTitle.DeviceDefault
风格;<style name="Theme.DeviceDefault" parent="Theme.Material" >
-- Text styles -->
<item name="textAppearance">@style/TextAppearance.DeviceDefault
- "buttonStyle"
>@style/Widget.DeviceDefault.Button
- "windowTitleStyle">@style/WindowTitle.DeviceDefault
......
由此我们将先来介绍风格style,之后再来介绍主题theme。
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/
style指的是某一类具体的控件的风格,例如TextView
的风格、Button
的风格。
指定控件的style,就是指定诸如它的字体大小、字体颜色、字体种类等元素,
<style name="BtnStyle">
<item name="android:textStyle">bolditem>
<item name="android:textSize">35spitem>
<item name="android:textColor">#FFFFFFFFitem>
style>
这好比一本书,书的一级标题要使用一号字体(字体要比别的字体大),二级标题要使用二号字体,以此类推。每一级标题使用的文字,就对应的一种style。以后在写书的时候,每使用某级的标题,就自然将文字显示成了这一级应该的字体大小。
res\values
目录下,新建一个styles.xml
文件;name="BtnStyle"
;<resources>
<style name="BtnStyle">
<item name="android:textStyle">bolditem>
<item name="android:textSize">35spitem>
<item name="android:textColor">#FFFFFFFFitem>
style>
resources>
style也可以从已有的style继承而来。
style有两种继承方式,一种是显式继承,一种是隐式继承。
parent=
属性,<style name="ExBtnStyle" parent="@style/BtnStyle">
--增加了background属性的设定-->
<item name="android:background">@drawable/btn_selector
- "android:textColor"
>#FFFFFFFF
style>
.
为分隔符取名,例如"BtnStyle.ExBtnStyle
,被继承的style名称要放在前面;子style
中,定义需要扩展或者需要覆盖的属性,<style name="BtnStyle.ExBtnStyle">
--增加了background属性的设定-->
<item name="android:background">@drawable/btn_selector
- "android:textColor"
>#FFFFFFFF
style>
style有两种使用方式。
直接针对具体的控件使用。
通过控件的style属性设置,
<Button
android:id="@+id/btn_3"
android:text="3"
--通过style属性设置-->
style="@style/BaseBtnStyle.DigitalBtnStyle" />
提供给theme使用。
相关的内容请参考主题相关的章节。
style可以设置的属性很多,不同的控件有不同的属性。具体有哪些属性可以设置,可以参考控件的开发文档,例如TextView
就有很多属性,开发文档都有列举。
在对属性值设置时,可以使用三种方式。
直接赋值:直接将要设定的值写到item标签当中,
<item name="android:textColor">#FFFFFFFFitem>
@
引用:将要设定的值通过@
引用,设置给item标签,这种引用是将要设定的值换了一个名字,
<item name="android:textColor">@color/text_coloritem>
?
引用:这种引用并不直接设置值,而是表明希望设置的值与“另一个属性”的值相同;这“另一个属性”定义在当前使用的主题当中(怎么定义的会在主题相关的章节介绍),
<item name="android:textColor">?android:attr/textColorLink
item>
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/
主题theme由具备各种风格style的组件组合起来的。如果说style关注的是具体某个控件,那么theme就关注的是整体宏观的方面,例如一个Activity或者一个应用整体。
theme的定义与style的定义完全一样,一样的标签、一样的写法,
res\values
目录下,新建一个themes.xml
文件(如果使用styles.xml
文件)也可以;name="Mytheme"
;<resources>
<style name="MyTheme">
<item name="colorPrimary">#FFFF0000item>
<item name="colorPrimaryDark">@color/colorPrimaryDark
- "colorAccent"
>@color/colorAccent
style>
resources>
theme的继承与style的继承完全一样
theme也可以从已有的theme继承而来。
theme与style一样,有两种继承方式,一种是显式继承,一种是隐式继承。
parent=
属性,<style name="ExMyTheme" parent="MyTheme">
--覆盖了父style中的colorAccent属性-->
<item name="colorAccent">#FFFFFFFFitem>
style>
.
为分隔符取名,例如"MyTheme.ExMyTheme
,被继承的theme名称要放在前面;子theme
中,定义需要扩展或者需要覆盖的属性,<style name="MyTheme.ExMyTheme">
--覆盖了父style中的colorAccent属性-->
<item name="colorAccent">#FFFFFFFFitem>
style>
theme常用在两种地方,一个是应用,一个是Activity。
配置文件中设置:在项目工程的AndroidManifest.xml
文件中,application标签的android:theme
属性,就用来指定整个应用的theme
<application
--指定应用的theme-->
android:theme="@style/MyTheme">
java源码中设置:当应用被创建的时候,在Application
的onCreate()
函数中设置,
@Override
public void onCreate() {
super.onCreate();
this.setTheme(R.style.MyTheme);
}
配置文件中设置:在项目工程的AndroidManifest.xml
文件中,
标签的android:theme
属性,就用来指定该Activity的theme
<activity android:name=".MainActivity"
--指定应用的theme-->
android:theme="@style/MyTheme">
java源码中设置:当应用被创建的时候,在Activity
的onCreate()
函数中设置,
@Override
public void onCreate() {
super.onCreate();
this.setTheme(R.style.MyTheme);
}
在对属性值设置时,可以使用三种方式,前两种已经在style的相关章节介绍了,下面介绍?
引用。
这种引用并不直接设置值,而是表明希望设置的值与“另一个属性”的值相同;这“另一个属性”定义在当前使用的主题当中,例如,
创建自定义属性myAttr
:在res\values
目录下创建一个attrs.xml
文件,添加一个自定义属性myAttr
,
<resources>
<attr name="myAttr" format="color" />
resources>
定义一个theme-MyTheme,设置myAttr
的值,
<resources>
<style name="MyTheme">
<item name="myAttr">#FFFF00item>
style>
resources>
让这个应用使用MyTheme
,作为应用的主题(当然也可以指定某个具体的Activity使用这个主题),
<application
--指定应用的theme-->
android:theme="@style/MyTheme">
定义一个style-MyStyle,使用myAttr
来指定按钮文字的颜色,
<style name="BtnStyle">
<item name="android:textColor">?myAttritem>
style>
为布局文件中的一个Button
使用MyStyle
<Button
android:id="@+id/btn_3"
android:text="3"
--通过style属性设置-->
style="@style/MyStyle" />
这样,Button
显示的文字颜色就是MyTheme
中myAttr
指定的颜色了。
theme可以设置的属性很多,可以参考安卓的系统源码themes.xml themes_device_defaults.xml themes_material.xml themes_holo.xml等,里面使用了很多定义主题时用到的属性。
不过里面有的属性是不对应用层开放的,在应用层使用的这些属性的时候,如果遇到编译错误,那么多半就是这个原因。
系统主题的属性很多,我们将选择性的介绍一些重要属性的用法和效果。
调色板属性是主题最为重要的属性,它决定了主题的配色。这些属性包括,
android:colorPrimaryDark
:android:colorPrimary
:android:colorAccent
:android:colorEdgeEffect
:android:colorControlNormal
:android:colorControlActivated
:android:colorControlHighlight
:android:colorButtonNormal
:android:colorSwitchThumbNormal
:如果一款应用设计了自己的配色方案,那么修改这些属性,会让开发的效率大大提高。
例如colorAccent
就被很多控件利用?访问
的方式使用到,一旦修改了它,很多控件的配色也就跟着变化了。例如,我们将该属性的值设置成绿色,
其它属性也对应着修改界面控件的某些颜色,由于它们都是和主题配色相关的属性,所以称它们为调色板属性。
从安卓5.0起,Android SDK加入了对导航栏和状态栏颜色的设定属性,
android:navigationBarColor
;状态栏:android:statusBarColor
;
<style name="MyTheme">
--导航栏设置成红色-->
<item name="android:navigationBarColor">#F00item>
--状态栏设置成绿色-->
<item name="android:statusBarColor">#0F0item>
style>
安卓系统内置了很多种主题,它们各有各的特点,也具有很多共同的性质。
按照设计思路,分成三个大类:
theme:这是安卓系统刚诞生时使用的界面元素设计理念,具有暗色和亮色两种风格;
Holo
:这是安卓系统3.0时开始使用的界面元素设计理念,具有暗色和亮色两种风格;
Material
:这是安卓系统5.0时开始使用的界面元素设计理念,具有暗色和亮色两种风格;
以上三个大类下面还有很多主题,可以通过Android Studio提供的preview
工具看到这些主题。
activity_main.xml
;预览窗口
上红色方框对应的图标,会弹出一个Select Theme
窗口;这里分门别类的列举出了所有可用的系统内置的主题。
最后需要特别的指出一个类型的主题:device default
。
它并不是除了theme holo
material
之外的第四类,而是为了安卓系统在不同版本上的兼容性而采取的兼容方案。
可以简单的认为,当使用这种主题的应用在安卓3.0~安卓5.0之间的版本上运行时,它使用的主题就是holo
;当使用这种主题的应用在安卓5.0以上的版本,它使用的主题就是material
。
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。
*最后再次感谢各位读者对安豆
的支持,谢谢:)
/*******************************************************************/