Styles and Themes
一个样式是一个属性的集合,他定义了一个View的外观和格式。他可以定义,高度、宽度、填充、间隔等等。他可以定义在一个独立的文件中。在android中的样式,是一个小于CCS的一个集合。它允许你把内容和设计分离。例如:<TextView转变为这样
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:typeface="monospace"
android:text="@string/hello" />
<TextView
android:text="@string/hello" />
所有的属性都从layout文件中删除,并把他们放入@style/CodeFont文件中。并把应用到style属性中。一个主题是应用于一个应用中所有的Activity的样式。当一个主题应用于某个应用或者Activity,它们的所有样式属性都将修改。
Defining Styles
创建一个样式文件,需要放在res/values文件夹中,他是一个xml文件。根节点是<resources>,每一个样式都必须用<style>定义一个唯一的名字。用<item>定义每一个样式属性name属性表示属性名称,和一个值(可选)。<item>可以是一个关键字、一个颜色值、一个引用其他地方的属性或者其他依赖于这个属性的值。例如:<resources>每一个<resurces>的子节点,都在编译阶段转变为一个资源对象,能用style的name属性引用。像上面的这个例子,可以用CodeFont来引用这个样式。parent属性定义了其他样式的资源ID,你可以覆写这些资源ID.记住样式和主题可以应用于一个View中。
<style name="CodeFont" parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
</style>
</resources>
Inheritance
parent属性让你继承一个父属性,从一个已经存在的样式文件中,或者覆写你要改变的属性。你可以继承你自定义的样式或者系统已有的样式。例如你可以继承和修改他系统的文本样式。<style name="GreenText" parent="@android:style/TextAppearance">如果你想要继承你自己定义的样式,你并不需要parent属性。你可以使用.语法来定义一个已有属性的后缀。例如之前定义的CodeFont样式,你又想定义个文字颜色为红色,这个时候你就可以像下面这样定义
<item name="android:textColor">#00FF00</item>
</style>
<style name="CodeFont.Red">这里没有parent属性在个样式成分中。你还能够继续扩张
<item name="android:textColor">#FF0000</item>
</style>
<style name="CodeFont.Red.Big">这是定义了在Red下的字体大小。这种技术只能用在你自定义的样式Xml中。要继承系统定义的属性文件必须使用parent属性。
<item name="android:textSize">30sp</item>
</style>
Style Properties
现在你知道怎样定义一个样式了。我再来看看有哪些样式的种类。他们可以用<item>定义的。你或许已经熟悉其中的一些。例如layout_width和textColor,还有更多的属性。最好的方法是查看相关类的文档,那里有所有支持的样式和他们的作用。例如所有文本的样式都在TextView类的文档中。其中一个叫做android:inputType,他通常放在EditText成员中。<EditText你可以替换这个属性用style属性
android:inputType="number"
... />
<style name="Numbers">这样你的xml文件可以这样定义
<item name="android:inputType">number</item>
...
</style>
<EditText这个简单的例子使你可以在不同的地方使用这个样式。所有可用的样式可以查看R.attr的文档。不是所有的样式被所有的View所接受,你要根据你的View来定义样式。一些样式属性不支持一些View,仅能够应用于主题。他要被应用于说有的窗口,而不是用在某些View。例如一些主题要隐藏标题、状态栏或者改变窗口背景。这些种类的属性并不属于一些View。查找这些属性可以到R.attr的Window中。例如:windowNoTitle和windowBackgroud属性仅在Activity或者Window产生影响。注意:不要忘了在<item>属性中添加android前缀。
... />
Applying Styles and Themes to the UI
有两个途径设置一个样式当你单独的应用一个样式在可以在layout文件中添加。你给一个ViewGroup对象添加一个样式,他的子View不会继承。你可以应用一个样式应用于所有的子View就像一个主题。要应用一个主题,你必须把它应用于Activity或者一个应用。你必须定义在manifest文件中。每个View定义在Activity中的都要应用主题。如果你要应用一个CodeStyle,你的Activity都要应用这个样式。如果某个View不支持这个属性。他就忽略它。Apply a style to a View
这里显示怎样应用一个样式到一个layout文件<TextView现在TextView样式将被定义为CodeFont注意:style属性不要android:名字空间。
android:text="@string/hello" />
Apply a theme to an Activity or application
设置一个主题,可以在<Application>标签中,使用android:theme属性。<application android:theme="@style/CustomTheme">如果想要应用一个主题到Activity中就要使用在<Activity>的android:theme属性。
<application android:theme="@style/CustomTheme">就像其他许多系统构建的资源一样,系统也有很多主题,例如Dailog主题
<activity android:theme="@android:style/Theme.Dialog">或者你想要背景透明
<activity android:theme="@android:style/Theme.Translucent">如果你想要一个系统主题,但是有想要一定的个人风格。
<color name="custom_theme_color">#b0b0ff</color>注意颜色属性必须分开设置,因为android:background属性必须引用。你需要用CustomTheme来替换原来的风格。
<style name="CustomTheme" parent="android:Theme.Light">
<item name="android:windowBackground">@color/custom_theme_color</item>
<item name="android:colorBackground">@color/custom_theme_color</item>
</style>
<activity android:theme="@style/CustomTheme">
Select a theme based on platform version
新版本的系统提供主题的适用性。你可能要用旧版本的主题。你能完成这个,使用资源后缀来定义不同版本的主题。例如这里定义一个基础版本的主题(高光)他是res/values/style.xml文件<style name="LightThemeSelector" parent="android:Theme.Light">如果你想要用一个新的版本的主题例如android3.0中的主题你可以使用res/values-v11这样的文件夹定义
...
</style>
<style name="LightThemeSelector" parent="android:Theme.Holo.Light">这样做以后,你的应用就能自动在android3.0时用这个主题你能使用的基础主题在R.styleable.Theme中。
...
</style>