风格和主题(Styles and Themes)
风格就是用来指定view或者window的外貌和格式的一系列的属性的集合,包括高度,间隙,字体大小,颜色,背景颜色等。风格是通过XML资源定义,它跟知道layout的XML文件不同。
Android 风格跟网页设计一样,允许将内容跟设计分离。
例如要设计下面这个TextView,XML layout 定义如下:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:typeface="monospace"
android:text="@string/hello" />
style 设计模式如下:
<TextView
style="@style/CodeFont"
android:text="@string/hello" />
所有跟风格相关的属性都从XML layout移到了了一个叫做CodeFont的style中,具体定义后面会介绍。
主题也是一种风格,不过它是被应用到整个的活动或者应用中,而不是应用到一个单独的view。当一个风格被应用为一个主题时,这个活动或者应用中的所有view 都会采用它所支持的style的所有属性。
定义一个风格
1. 在APP的 /res/values/ 目录下面建立一个XML文件,文件名随意取定,但是文件后缀名必须是.xml.例如style.xml
2. style.xml 文件的根节点必须是 <resources>
3. 每个<style>元素对于一个风格,对于这个元素,它的name 属性是用来识别它的唯一标志
4. 对于一个风格的每个属性,都需要添加一个<item>元素,<item>元素包含一个属性名和一个属性值
例子如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<stylename="CodeFont"parent="@android:style/TextAppearance.Medium">
<itemname="android:layout_width">fill_parent</item>
<itemname="android:layout_height">wrap_content</item>
<itemname="android:textColor">#00FF00</item>
<itemname="android:typeface">monospace</item>
</style>
</resources>
<resources>元素的每个子元素在编译的时候就会转换成一个应用资源对象,然后通过它的name的值就能引用它了。
<style>元素的parent 属性是可选的。它通过资源ID指定了该style应该从其它style继承得到的属性,同时你也可以复写这些属性。
一个style,无论是用作主题还是风格,它们都是定义在XML文件中的。
继承
<style>元素的继承属性允许你的style继承来自其它style定义的属性(包括自己另外定义的或者系统本省提供的)。然后你只需要添加一些额外的属性即可。同时你也能复写继承得到的属性来改变它本身的值。例如继承自系统的style:
<style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">#00FF00</item>
</style>
如果你需要继承你自己的style,不一定非要parent属性。你只需要将你要继承的style名字作为新style的前缀,并用点隔开即可。例如继承自CodeFont 的style Red定义如下:
<style name="CodeFont.Red">
<item name="android:textColor">#FF0000</item>
</style>
引用方法:@style/CodeFont.Red
.
这种通过前缀名和.的继承方式可以无限制的继承下去,例如:
<style name="CodeFont.Red.Big">
<item name="android:textSize">30sp</item>
</style>
注意:这种继承方式只能用于你自己定义的style.要想继承系统的style,必须使用parent属性。
风格的属性
既然已经知道如何定义一个风格,那么我们有必要了解下风格里面的<item>元素可以定义哪些属性。
对于一个view而言,要定义它的<item>属性,最好的办法就是去这个view的参考类中去找,这个参考类会列出所有支持的XML属性。这些属性以及它父类的属性都能够被定义在style 中。
例子:
<EditText
android:inputType="number"
... />
You can instead create a style for the EditText
element that includes this property:
<stylename="Numbers">
<itemname="android:inputType">number</item>
...
</style>
So your XML for the layout can now implement this style:
<EditText
style="@style/Numbers"
... />
这种工作看上行去更复杂,实际上当你有大量的属性要设置的时候,这种做法是很值得推荐的。
此外,在R.attr 中,你能够找到所有的style 属性。值得一提的是,如果你将一个style应用到一个view中,但是某些属性这个view不支持,就会直接忽视,将支持的应用起来。
对于某些属性不能被任何view支持,只能应用为主题。这些属性是应用到一个窗口的。而不是任何一个view.例如隐藏应用的标题,状态栏,改变窗口的背景颜色等(更多请看:R.attr 中 window.开头的属性)。
注意:<item>的格式:<item name="android:inputType">
.
将风格和主题应用到UI
在R.style 类中有大量的style供你使用。为了更好的理解style.请参照这些style的源码。