前言:

相同点:主题theme与风格style是两个很相近的概念。它们都定义在xml文件中,都使用<style/>标签。

不同点:主题与风格是包含与被包含的关系。例如同一个主题中,按钮使用一种风格,进度条使用一种风格。可以说主题是由具备各种风格的组件组合起来的。



场景:



从下面定义的主题例子中,我们可以看到

  1. 这个主题里面的

文字

  1. ,使用的是

TextAppearance.DeviceDefault

  1. 风格;
  2. 这个主题里面的

按钮

  1. ,使用的是

Widget.DeviceDefault.Button

  1. 风格;
  2. 这个主题的

窗口标题

  1. ,使用的是

WindowTitle.DeviceDefault

  1. 风格;
<style name="Theme.DeviceDefault" parent="Theme.Material" >
        <!-- Text styles -->
        <item name="textAppearance">@style/TextAppearance.DeviceDefault</item>
         <!-- Button styles -->
        <item name="buttonStyle">@style/Widget.DeviceDefault.Button</item>
        <!-- Window attributes -->
        <item name="windowTitleStyle">@style/WindowTitle.DeviceDefault</item>
        ......
<style/>

由此我们将先来介绍风格style,之后再来介绍主题theme

第2节 风格-style

style指的是某一类具体的控件的风格,例如TextView的风格、Button的风格。style,就是指定诸如它的字体大小、字体颜色、字体种类等元素,

<style name="BtnStyle">
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">35sp</item>
    <item name="android:textColor">#FFFFFFFF</item>
</style>

style。以后在写书的时候,每使用某级的标题,就自然将文字显示成了这一级应该的字体大小。

2.1 style的定义

res\values

  1. 目录下,新建一个

styles.xml

  1. 文件;
  2. 在新建的文件中,使用
<resources>
    <style name="BtnStyle">
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">35sp</item>
        <item name="android:textColor">#FFFFFFFF</item>
    </style>
</resources>

2.2 style的继承

style也可以从已有的style继承而来。 

style有两种继承方式,一种是显式继承,一种是隐式继承。

2.2.1 显示继承

  1. 继承已有的style时,使用

parent=

  1. 属性,
  2. 在子style中,定义需要扩展或者需要覆盖的属性,
<style name="ExBtnStyle" parent="@style/BtnStyle">

    <!--增加了background属性的设定-->
    <item name="android:background">@drawable/btn_selector</item>

    <!--覆盖了父style中的textColor属性-->
    <item name="android:textColor">#FFFFFFFF</item>
</style>

2.2.2 隐式继承

  1. 继承已有的

style

  1. ,给新

style

.

  1. 为分隔符取名,例如

"BtnStyle.ExBtnStyle

  1. ,被继承的

style

  1. 名称要放在前面;

子style

  1. 中,定义需要扩展或者需要覆盖的属性,
<style name="BtnStyle.ExBtnStyle">

    <!--增加了background属性的设定-->
    <item name="android:background">@drawable/btn_selector</item>

    <!--覆盖了父style中的textColor属性-->
    <item name="android:textColor">#FFFFFFFF</item>
</style>

2.3 style的使用

style有两种使用方式。

  1. 直接针对具体的控件使用。 
    通过控件的

style

  1. 属性设置,
<Button
    android:id="@+id/btn_3"
    android:text="3"
    <!--通过style属性设置-->
    style="@style/BaseBtnStyle.DigitalBtnStyle" />

theme

  1. 使用。 
    相关的内容请参考主题相关的章节。

2.4 style可用的各种属性

style可以设置的属性很多,不同的控件有不同的属性。具体有哪些属性可以设置,可以参考控件的开发文档,例如TextView就有很多属性,开发文档都有列举。

2.5 属性值的设置

在对属性值设置时,可以使用三种方式。

  1. 直接赋值:直接将要设定的值写到\标签当中,
<item name="android:textColor">#FFFFFFFF</item>

@

  1. 引用:将要设定的值通过

@

  1. 引用,设置给\标签,这种引用是将要设定的值换了一个名字,
<!--text_color的数值已经定义在了别的地方-->
<item name="android:textColor">@color/text_color</item>

  1. 引用:这种引用并不直接设置值,而是表明希望设置的值与“另一个属性”的值相同;这“另一个属性”定义在当前使用的主题当中(怎么定义的会在主题相关的章节介绍),
<!--使用与android:textColorLink属性相同的值,而不关心这个数值是到底是多少-->
<item name="android:textColor">?android:attr/textColorLink
</item>

第3节 主题-theme

主题theme由具备各种风格style的组件组合起来的。如果说style关注的是具体某个控件,那么theme就关注的是整体宏观的方面,例如一个Activity或者一个应用整体。

3.1 theme的定义

theme的定义与style的定义完全一样,一样的标签、一样的写法,

res\values

  1. 目录下,新建一个

themes.xml

  1. 文件(如果使用

styles.xml

  1. 文件)也可以;
  2. 在新建的文件中,使用\
<resources>
    <style name="MyTheme">
        <item name="colorPrimary">#FFFF0000</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

3.2 theme的继承

theme的继承与style的继承完全一样 

theme也可以从已有的theme继承而来。 

themestyle一样,有两种继承方式,一种是显式继承,一种是隐式继承。

3.2.1 显示继承

  1. 继承已有的

theme

  1. 时,使用

parent=

  1. 属性,
  2. 在子

theme

  1. 中,定义需要扩展或者需要覆盖的属性,
<style name="ExMyTheme" parent="MyTheme">

    <!--覆盖了父style中的colorAccent属性-->
    <item name="colorAccent">#FFFFFFFF</item>
</style>

3.2.2 隐式继承

  1. 继承已有的

theme

  1. ,给新

theme

.

  1. 为分隔符取名,例如

"MyTheme.ExMyTheme

  1. ,被继承的

theme

  1. 名称要放在前面;

子theme

  1. 中,定义需要扩展或者需要覆盖的属性,
<style name="MyTheme.ExMyTheme">
    <!--覆盖了父style中的colorAccent属性-->
    <item name="colorAccent">#FFFFFFFF</item>
</style>

3.3 theme的使用

theme常用在两种地方,一个是应用,一个是Activity。

3.3.1 应用使用theme

AndroidManifest.xml

  1. 文件中,

<application/>

  1. 标签的

android:theme

  1. 属性,就用来指定整个应用的

theme

<application
    <!--指定应用的theme-->
    android:theme="@style/MyTheme">

Application

onCreate()

  1. 函数中设置,
@Override
public void onCreate() {
    super.onCreate();

    this.setTheme(R.style.MyTheme);
}

3.3.2 Activity使用theme

AndroidManifest.xml

  1. 文件中,

<activity/>

  1. 标签的

android:theme

  1. 属性,就用来指定该Activity的

theme

<activity android:name=".MainActivity"
    <!--指定应用的theme-->
    android:theme="@style/MyTheme">

Activity

onCreate()

  1. 函数中设置,
@Override
public void onCreate() {
    super.onCreate();

    this.setTheme(R.style.MyTheme);
}

3.4 属性值的设置

style的相关章节介绍了,下面介绍?引用。

这种引用并不直接设置值,而是表明希望设置的值与“另一个属性”的值相同;这“另一个属性”定义在当前使用的主题当中,例如,

myAttr

  1. :在

res\values

  1. 目录下创建一个

attrs.xml

  1. 文件,添加一个自定义属性

myAttr

<resources>
    <!--format设置成color,说明myAttr希望获得的值是用来表示颜色的-->
    <attr name="myAttr" format="color" />
</resources>

theme

  1. -MyTheme,设置

myAttr

  1. 的值,
<resources>
    <style name="MyTheme">
        <item name="myAttr">#FFFF00</item>
    </style>
</resources>

MyTheme

  1. ,作为应用的主题(当然也可以指定某个具体的Activity使用这个主题),
<application
    <!--指定应用的theme-->
    android:theme="@style/MyTheme">

style

  1. -MyStyle,使用

myAttr

  1. 来指定按钮文字的颜色,
<style name="BtnStyle">
    <item name="android:textColor">?myAttr</item>
</style>

Button

  1. 使用

MyStyle

<Button
    android:id="@+id/btn_3"
    android:text="3"
    <!--通过style属性设置-->
    style="@style/MyStyle" />

Button显示的文字颜色就是MyThememyAttr指定的颜色了。

3.5 theme可用的各种属性

theme可以设置的属性很多,可以参考安卓的系统源码themes.xml themes_device_defaults.xml themes_material.xml themes_holo.xml等,里面使用了很多定义主题时用到的属性。

不过里面有的属性是不对应用层开放的,在应用层使用的这些属性的时候,如果遇到编译错误,那么多半就是这个原因。

系统主题的属性很多,我们将选择性的介绍一些重要属性的用法和效果。

3.5.1 调色板属性

调色板属性是主题最为重要的属性,它决定了主题的配色。这些属性包括,

android:colorPrimaryDark

android:colorPrimary

android:colorAccent

android:colorEdgeEffect

android:colorControlNormal

android:colorControlActivated

android:colorControlHighlight

android:colorButtonNormal

android:colorSwitchThumbNormal

如果一款应用设计了自己的配色方案,那么修改这些属性,会让开发的效率大大提高。

colorAccent就被很多控件利用?访问的方式使用到,一旦修改了它,很多控件的配色也就跟着变化了。例如,我们将该属性的值设置成绿色,


其它属性也对应着修改界面控件的某些颜色,由于它们都是和主题配色相关的属性,所以称它们为调色板属性。

3.5.2 导航栏、状态栏属性

从安卓5.0起,Android SDK加入了对导航栏和状态栏颜色的设定属性,

  1. 导航栏:

android:navigationBarColor

android:statusBarColor

<style name="MyTheme">
    <!--导航栏设置成红色-->
    <item name="android:navigationBarColor">#F00</item>

    <!--状态栏设置成绿色-->
    <item name="android:statusBarColor">#0F0</item>
</style>


3.6 系统主题

安卓系统内置了很多种主题,它们各有各的特点,也具有很多共同的性质。

按照设计思路,分成三个大类:

Theme

  1. :这是安卓系统刚诞生时使用的界面元素设计理念,具有暗色和亮色两种风格;

Holo

  1. :这是安卓系统3.0时开始使用的界面元素设计理念,具有暗色和亮色两种风格;

Material

  1. :这是安卓系统5.0时开始使用的界面元素设计理念,具有暗色和亮色两种风格;

preview工具看到这些主题。

  1. 打开任意一个布局文件,例如

activity_main.xml

  1. ;
  2. 点击

预览窗口

  1. 上红色方框对应的图标,会弹出一个

Select Theme

  1. 窗口;


这里分门别类的列举出了所有可用的系统内置的主题。

device default。 

它并不是除了themeholomaterial之外的第四类,而是为了安卓系统在不同版本上的兼容性而采取的兼容方案。holo;当使用这种主题的应用在安卓5.0以上的版本,它使用的主题就是material

  1. 转载地址:http://keeganlee.me/post/android/20151031


前言:

相同点:主题theme与风格style是两个很相近的概念。它们都定义在xml文件中,都使用<style/>标签。

不同点:主题与风格是包含与被包含的关系。例如同一个主题中,按钮使用一种风格,进度条使用一种风格。可以说主题是由具备各种风格的组件组合起来的。


场景:


从下面定义的主题例子中,我们可以看到

  1. 这个主题里面的

文字

  1. ,使用的是

TextAppearance.DeviceDefault

  1. 风格;
  2. 这个主题里面的

按钮

  1. ,使用的是

Widget.DeviceDefault.Button

  1. 风格;
  2. 这个主题的

窗口标题

  1. ,使用的是

WindowTitle.DeviceDefault

  1. 风格;
<style name="Theme.DeviceDefault" parent="Theme.Material" >
        <!-- Text styles -->
        <item name="textAppearance">@style/TextAppearance.DeviceDefault</item>
         <!-- Button styles -->
        <item name="buttonStyle">@style/Widget.DeviceDefault.Button</item>
        <!-- Window attributes -->
        <item name="windowTitleStyle">@style/WindowTitle.DeviceDefault</item>
        ......
<style/>

由此我们将先来介绍风格style,之后再来介绍主题theme

第2节 风格-style

style指的是某一类具体的控件的风格,例如TextView的风格、Button的风格。style,就是指定诸如它的字体大小、字体颜色、字体种类等元素,

<style name="BtnStyle">
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">35sp</item>
    <item name="android:textColor">#FFFFFFFF</item>
</style>

style。以后在写书的时候,每使用某级的标题,就自然将文字显示成了这一级应该的字体大小。

2.1 style的定义

res\values

  1. 目录下,新建一个

styles.xml

  1. 文件;
  2. 在新建的文件中,使用
<resources>
    <style name="BtnStyle">
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">35sp</item>
        <item name="android:textColor">#FFFFFFFF</item>
    </style>
</resources>

2.2 style的继承

style也可以从已有的style继承而来。 

style有两种继承方式,一种是显式继承,一种是隐式继承。

2.2.1 显示继承

  1. 继承已有的style时,使用

parent=

  1. 属性,
  2. 在子style中,定义需要扩展或者需要覆盖的属性,
<style name="ExBtnStyle" parent="@style/BtnStyle">

    <!--增加了background属性的设定-->
    <item name="android:background">@drawable/btn_selector</item>

    <!--覆盖了父style中的textColor属性-->
    <item name="android:textColor">#FFFFFFFF</item>
</style>

2.2.2 隐式继承

  1. 继承已有的

style

  1. ,给新

style

.

  1. 为分隔符取名,例如

"BtnStyle.ExBtnStyle

  1. ,被继承的

style

  1. 名称要放在前面;

子style

  1. 中,定义需要扩展或者需要覆盖的属性,
<style name="BtnStyle.ExBtnStyle">

    <!--增加了background属性的设定-->
    <item name="android:background">@drawable/btn_selector</item>

    <!--覆盖了父style中的textColor属性-->
    <item name="android:textColor">#FFFFFFFF</item>
</style>

2.3 style的使用

style有两种使用方式。

  1. 直接针对具体的控件使用。 
    通过控件的

style

  1. 属性设置,
<Button
    android:id="@+id/btn_3"
    android:text="3"
    <!--通过style属性设置-->
    style="@style/BaseBtnStyle.DigitalBtnStyle" />

theme

  1. 使用。 
    相关的内容请参考主题相关的章节。

2.4 style可用的各种属性

style可以设置的属性很多,不同的控件有不同的属性。具体有哪些属性可以设置,可以参考控件的开发文档,例如TextView就有很多属性,开发文档都有列举。

2.5 属性值的设置

在对属性值设置时,可以使用三种方式。

  1. 直接赋值:直接将要设定的值写到\标签当中,
<item name="android:textColor">#FFFFFFFF</item>

@

  1. 引用:将要设定的值通过

@

  1. 引用,设置给\标签,这种引用是将要设定的值换了一个名字,
<!--text_color的数值已经定义在了别的地方-->
<item name="android:textColor">@color/text_color</item>

  1. 引用:这种引用并不直接设置值,而是表明希望设置的值与“另一个属性”的值相同;这“另一个属性”定义在当前使用的主题当中(怎么定义的会在主题相关的章节介绍),
<!--使用与android:textColorLink属性相同的值,而不关心这个数值是到底是多少-->
<item name="android:textColor">?android:attr/textColorLink
</item>

第3节 主题-theme

主题theme由具备各种风格style的组件组合起来的。如果说style关注的是具体某个控件,那么theme就关注的是整体宏观的方面,例如一个Activity或者一个应用整体。

3.1 theme的定义

theme的定义与style的定义完全一样,一样的标签、一样的写法,

res\values

  1. 目录下,新建一个

themes.xml

  1. 文件(如果使用

styles.xml

  1. 文件)也可以;
  2. 在新建的文件中,使用\
<resources>
    <style name="MyTheme">
        <item name="colorPrimary">#FFFF0000</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

3.2 theme的继承

theme的继承与style的继承完全一样 

theme也可以从已有的theme继承而来。 

themestyle一样,有两种继承方式,一种是显式继承,一种是隐式继承。

3.2.1 显示继承

  1. 继承已有的

theme

  1. 时,使用

parent=

  1. 属性,
  2. 在子

theme

  1. 中,定义需要扩展或者需要覆盖的属性,
<style name="ExMyTheme" parent="MyTheme">

    <!--覆盖了父style中的colorAccent属性-->
    <item name="colorAccent">#FFFFFFFF</item>
</style>

3.2.2 隐式继承

  1. 继承已有的

theme

  1. ,给新

theme

.

  1. 为分隔符取名,例如

"MyTheme.ExMyTheme

  1. ,被继承的

theme

  1. 名称要放在前面;

子theme

  1. 中,定义需要扩展或者需要覆盖的属性,
<style name="MyTheme.ExMyTheme">
    <!--覆盖了父style中的colorAccent属性-->
    <item name="colorAccent">#FFFFFFFF</item>
</style>

3.3 theme的使用

theme常用在两种地方,一个是应用,一个是Activity。

3.3.1 应用使用theme

AndroidManifest.xml

  1. 文件中,

<application/>

  1. 标签的

android:theme

  1. 属性,就用来指定整个应用的

theme

<application
    <!--指定应用的theme-->
    android:theme="@style/MyTheme">

Application

onCreate()

  1. 函数中设置,
@Override
public void onCreate() {
    super.onCreate();

    this.setTheme(R.style.MyTheme);
}

3.3.2 Activity使用theme

AndroidManifest.xml

  1. 文件中,

<activity/>

  1. 标签的

android:theme

  1. 属性,就用来指定该Activity的

theme

<activity android:name=".MainActivity"
    <!--指定应用的theme-->
    android:theme="@style/MyTheme">

Activity

onCreate()

  1. 函数中设置,
@Override
public void onCreate() {
    super.onCreate();

    this.setTheme(R.style.MyTheme);
}

3.4 属性值的设置

style的相关章节介绍了,下面介绍?引用。

这种引用并不直接设置值,而是表明希望设置的值与“另一个属性”的值相同;这“另一个属性”定义在当前使用的主题当中,例如,

myAttr

  1. :在

res\values

  1. 目录下创建一个

attrs.xml

  1. 文件,添加一个自定义属性

myAttr

<resources>
    <!--format设置成color,说明myAttr希望获得的值是用来表示颜色的-->
    <attr name="myAttr" format="color" />
</resources>

theme

  1. -MyTheme,设置

myAttr

  1. 的值,
<resources>
    <style name="MyTheme">
        <item name="myAttr">#FFFF00</item>
    </style>
</resources>

MyTheme

  1. ,作为应用的主题(当然也可以指定某个具体的Activity使用这个主题),
<application
    <!--指定应用的theme-->
    android:theme="@style/MyTheme">

style

  1. -MyStyle,使用

myAttr

  1. 来指定按钮文字的颜色,
<style name="BtnStyle">
    <item name="android:textColor">?myAttr</item>
</style>

Button

  1. 使用

MyStyle

<Button
    android:id="@+id/btn_3"
    android:text="3"
    <!--通过style属性设置-->
    style="@style/MyStyle" />

Button显示的文字颜色就是MyThememyAttr指定的颜色了。

3.5 theme可用的各种属性

theme可以设置的属性很多,可以参考安卓的系统源码themes.xml themes_device_defaults.xml themes_material.xml themes_holo.xml等,里面使用了很多定义主题时用到的属性。

不过里面有的属性是不对应用层开放的,在应用层使用的这些属性的时候,如果遇到编译错误,那么多半就是这个原因。

系统主题的属性很多,我们将选择性的介绍一些重要属性的用法和效果。

3.5.1 调色板属性

调色板属性是主题最为重要的属性,它决定了主题的配色。这些属性包括,

android:colorPrimaryDark

android:colorPrimary

android:colorAccent

android:colorEdgeEffect

android:colorControlNormal

android:colorControlActivated

android:colorControlHighlight

android:colorButtonNormal

android:colorSwitchThumbNormal

如果一款应用设计了自己的配色方案,那么修改这些属性,会让开发的效率大大提高。

colorAccent就被很多控件利用?访问的方式使用到,一旦修改了它,很多控件的配色也就跟着变化了。例如,我们将该属性的值设置成绿色,

其它属性也对应着修改界面控件的某些颜色,由于它们都是和主题配色相关的属性,所以称它们为调色板属性。

3.5.2 导航栏、状态栏属性

从安卓5.0起,Android SDK加入了对导航栏和状态栏颜色的设定属性,

  1. 导航栏:

android:navigationBarColor

android:statusBarColor

<style name="MyTheme">
    <!--导航栏设置成红色-->
    <item name="android:navigationBarColor">#F00</item>

    <!--状态栏设置成绿色-->
    <item name="android:statusBarColor">#0F0</item>
</style>


3.6 系统主题

安卓系统内置了很多种主题,它们各有各的特点,也具有很多共同的性质。

按照设计思路,分成三个大类:

Theme

  1. :这是安卓系统刚诞生时使用的界面元素设计理念,具有暗色和亮色两种风格;

Holo

  1. :这是安卓系统3.0时开始使用的界面元素设计理念,具有暗色和亮色两种风格;

Material

  1. :这是安卓系统5.0时开始使用的界面元素设计理念,具有暗色和亮色两种风格;

preview工具看到这些主题。

  1. 打开任意一个布局文件,例如

activity_main.xml

  1. ;
  2. 点击

预览窗口

  1. 上红色方框对应的图标,会弹出一个

Select Theme

  1. 窗口;


这里分门别类的列举出了所有可用的系统内置的主题。

device default。 

它并不是除了themeholomaterial之外的第四类,而是为了安卓系统在不同版本上的兼容性而采取的兼容方案。holo;当使用这种主题的应用在安卓5.0以上的版本,它使用的主题就是material