Android Style和Theme

Published: by Creative Commons Licence

Style and Theme

样式Style、主题Theme和属性:

主题实际就是一种样式,但是…

属性包含了,样式属性和主题属性;这也是区别样式和主题的一种方法。

样式Style

样式Style: 是一套能够用于View组件的 属性Attr

添加新样式:

<resources>
...
<style name="BeatBoxButton">		<!-- 样式  -->
	<item name="android:backgroud">@color/dark_bule</item>  <!-- 该样式所包含的属性和值  -->
	<item name="android:textSize">10sp</item>
	<item>...</item>
</style>
...
</resources>

将该样式应用于某个按钮:

<Button
	android:id="@+id/button1"
	style="@style/BeatBoxButton"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"/>


<Button
	android:id="@+id/button2"
	android:backgroud="@color/dark_bule"
	android:textSize="10sp"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"/>

上面button1和button2显示效果一样,使用一个style相当于同时设置了backgroud和textSize两个属性。

样式继承:一个样式能 继承覆盖 其他样式的属性。

使用.表示继承:继承我们自定义的Style时常用.来表示。
或使用parent="父Style" 来指定父Style,常用于继承系统自带的样式。

深入样式(主题)继承: 需要遵循的一条规定是,在跨库继承时必须使用parent属性。

<!-- 使用 . 表示继承-->
<style name="BeatBoxButton.Strong">
	<item name="android:textStyle">bold</item>
</style>

<!-- 使用parent 进行指定父style -->
<style name="StrongBeatBoxButton" parent="@style/BeatBoxButton">
	<item name="android:textStyle">bold</item>
</style>

样式的优缺点

样式的应用场景: styles.xml文件为公共文件;在该文件中可以为所有组件定义一套样式属性共用,(定义公共样式属性)。

样式的缺点: 样式在实际应用时,需要逐个为所有组件添加它们要用到的样式;组件一多就比较麻烦。

为解决样式的缺点则有了主题。

主题Theme

定义一套公共主题Theme,样式需要逐个添加,而主题属性会自动应用于整个应用。

主题属性:它能引用颜色这样的外部资源,也能引用 其他样式

使用主题,可以简单的说:“所有按钮都使用这个样式”。再也不用找每个按钮,直接告诉它们要用那个主题就好了。

主题是在AndroidManifest.xml文件中声明。

AppCompat库自带的三大主题:

  • Theme.AppCompat : 深色主题
  • Theme.AppCompat.Light : 浅色主题
  • Theme.AppCompat.Light.DarkActionBar : 带深色工具栏的浅色主题
<!-- 为AppTheme主题添加三个自定义属性  -->
<style name="AppTheme" parent="Theme.AppCompat">
	<item name="colorPrimary">@color/red</item>
	<item name="colorPrimaryDark">@color/dark_red</item>
	<item name="colorAccent">@color/gray</item>
</style>

注意: 从上面的三个主题属性中可以看出其与样式属性的属性名不同。其次其应用范围也不一样。

主题实际就是一种样式,但是…

属性包含了,样式属性和主题属性;这也是区别样式和主题的一种方法。

深入学习:引用主题属性

在主题中定义好属性后,可以在XML代码中直接使用它们。

之前在xml文件中引用具体值时,我们使用@符号。比如@color/gray指向某个特定资源。

引用主题属性时,我们使用?;例如:为按钮添加背景色

android:background="?attr/colorAccent"

覆盖主题属性

哪些主题属性可用?哪些主题属性可以覆盖?该主题属性有什么作用?

比如我要更改应用的背景色。是把应用中所有控件、fragment和Activity的背景色一一进行改变?还是直接覆盖主题的背景色?这个主题的背景色对应的主题属性名称又是什么(究竟要覆盖哪个属性)?

查找该属性名称的方法见书。

修改应用中所有按钮的某些属性

见书

ThemeOverlay

5.0 level 21之后,可以给view单独设置theme属性了。Android预定义了一组叫做ThemeOverlay的style,现在多用在action bar上,它可以覆盖父类定义的theme的部分属性。

作为 Application Theme 的 parent 主题,Theme.AppCompat 提供了诸多属性设置 App 全局 Views 样式。但是有时候,我们还是需要单独给某个或者某些 View 设置与全局样式不一样的样式。这种情况下,ThemeOverlay.AppCompat 就派上用场啦。

给view单独设置一个theme的主要用在ToolBar上;比如当前使用白色主题但想用黑色的ToolBar,只需在ToolBar的xml文件中添加 android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar"即可。

ToolBar中 PopupTheme属性是用来控制弹出菜单的样式。

如果你在某View上见到如下示例,android:theme="@style/AppTheme.Secondary" 那么主题AppTheme.Secandary继承了ThemeOverlay.AppCompat

参考:

Style and Theme参考:

ThemeOverlay参考: