<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:typeface="monospace"
android:text="@string/hello" />
<TextView
style="@style/CodeFont"
android:text="@string/hello" />
<?xml version="1.0" encoding="utf-8"?>
<resources>
<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>
如果你想要继承自身定义的样式,你可以不必使用parent属性。相反,可以使用你想继承样式的名称作为新样式名称的前缀,并以点分隔开。例如,新建一个新样式去继承上面CodeFont样式,但是颜色变为红色,你可以这样新建样式:<style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">#00FF00</item>
</style>
<style name="CodeFont.Red">
<item name="android:textColor">#FF0000</item>
</style>
<style name="CodeFont.Red.Big">
<item name="android:textSize">30sp</item>
</style>
查看一个视图可以支持哪些属性,最好的地方是它对应的class reference,那儿列出了它能支持的所有XML属性。
例如,所有列出在TextView XML 属性表格中的属性能够被用于定义TextView的样式的元素。其中一个属性是android:inputType
, 你可能以前在<EditText>的属性使用过它,就像这样:
<EditText
android:inputType="number"
... />
现在你能为EditText创建一个样式,来包含这个属性:
<stylename="Numbers">
<item name="android:inputType">number</item>
...
</style>
这样你能在布局文件中这样写了:
<EditText
style="@style/Numbers"
... />
这个简单的例子看起来让你做了更多的工作,但是当你需要很多的样式属性时,我们就可以在很多地方重复利用这个定义的样式,这时它的回报是巨大的。
想要查看所有可用的样式属性,可以查看R.attr reference。记住,并不是所有的View对象都支持相同的样式属性,所以你通常应该参考特定View类型来查看所支持的样式属性。然而,如果你将一个样式应用到一个View,而这个View并不支持这个样式中所有属性,那么View将只应用于它支持的属性,而忽略那些它不支持的属性。
对于一些样式属性,然后,并不支持任何View元素,只能被用于作为主题。这些样式属性应用与整个window而不是任何类型的View。例如,一些主题样式的属性能够隐藏应用标题,隐藏状态栏,或者改变window的背景色。这些样式属性不属于任何View的对象。想要查看这些theme-only样式属性,可以查看R.attr reference 中以“window”开头的属性。例如,windowNoTitle 和 windowBackground 仅仅在样式被作为一个Activity 中或应用程序中主题时,才能时有效的。
下面是一些关于样式作为主题的信息。
注意:不要忘记在每个<item>中的属性名称都以命名空间“android:”开头。比如:<item name="android:inputType">
4:在UI中应用样式和主题
这里有两种方式去设置样式:
1:对于单个View,可以在布局文件中对应的View标签上添加style属性。
2:对于整个Activity或应用程序,通过在Android manifest 文件中的<activity>或<application>标签中增加android:theme 属性。
当你对布局文件中的单个View使用样式时,那么在样式中定义的属性就会仅仅应用在该View中。如果一个样式被应用在ViewGroup上,那么它的子View元素不会继承样式属性,只有你直接在该子元素中应用样式才能使用该属性。然而,你可以将样式作为主题使用,这样就会对所有的View产生效果。
为了将样式作为主题使用,你必须将样式应用在在Andriod mainfest 文件中的 Activity 或者 应用程序中。当你这样做了之后,那么在这个Activity 或 应用程序中的所有View 都会应用到该样式中支持的属性。例如:
如果你在一个Activitiy 上使用上面的CodeFont样式,那么所有View元素中支持文本样式的属性都会应用这个样式。任何不支持CodeFont样式中属性的View将会忽略他们。如果有一个View仅仅支持其中一些属性,那么就只有这些属性产生效果。
5:在View中使用样式
这里解释了在XML布局文件中如何为一个View设置样式:
<TextView
style="@style/CodeFont"
android:text="@string/hello"/>
现在这个TextView 将会被设置为CodeFont样式。
注意:style 属性不需要使用“android:”命名前缀。
6:在Activity或者应用程序中使用主题
<application android:theme="@style/CustomTheme">
如果你想在应用程序中一个主题应用在一个Activity上,你需要在<activity>标签上增加android:theme属性。
<activity android:theme="@android:style/Theme.Dialog">
或者,你想要背景透明的,直接使用背景透明的主题:
<activity android:theme="@android:style/Theme.Translucent">
如果你喜欢一个主题,但是想要稍稍调整,只需要在你的自定义主题上增加parent属性。例如,你能够修改传统的淡主题去使用你自己的颜色:
<color name="custom_theme_color">#b0b0ff</color>注意:这个color需要提供单独的支持,因为 android:windowBackground 属性仅支持其它资源的引用;
<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>
现在AndroidManifest.xml中使用CustomTheme。
<activity android:theme="@style/CustomTheme">7:基于平台版本选择一个主题
新的andorid版本为应用程序提供了额外的主题使用,你可能想在应用程序中使用这些主题,又希望能够与老版本兼容。你可以利用资源选择参数来做到这一点:在不同的平台版本上使用不同的主题。
例如:这里有一个自定义主题简单的继承了默认light theme。它可能出现在res/values目录下的一个XML文件中(一般是res/values/styles.xml)
<style name="LightThemeSelector"parent="android:Theme.Light">
...
</style>
当应用程序运行在android 3.0 或者更高上,为了让这个主题使用全新的全息主题,你可以在res/values-v11目录下为主题创建一个替代的主题,但是保证parent是全息主题:
<style name="LightThemeSelector"parent="android:Theme.Holo.Light">现在按照一般方式使用这个主题,当你的应用程序运行在android 3.0 或者更高时,你的应用程序会自动切换到全息主题。
...
</style>
你可以在R.styleable.Theme上找到一张关于你能在主题中使用的标准属性表。
想要知道更多关于根据平台版本或者设备配置提供可选资源,比如主题,布局等,你可以在Providing Resources文档中查看。
8:使用系统样式和主题
android 平台提供了大量的样式和主题,你可以应用在你的应用程序中。你可以在R.style 类中找到所有的可用的样式参考。为了使用那些样式列表,你需要把下划线替换为点。例如,你可以通过“@android:style/theme.NoTitleBar”使用Theme_NoTitleBar 主题。
然而,这份 R.stytle 参考并不是一份好的文档,而且描述的不全面。但是,通过阅读关于这些样式和主题的真实代码可以让你更好的理解它们提供了哪些属性。想更多的了解Android 样式和主题,请阅读下面的源代码:
这些文件会通过例子来帮助你理解。例如,在Android themes源代码中,你会找到<style name="Theme.Dialog">声明。在这个定义中,你会发现所有用于样式对话框的属性都用于Android框架。
想知道更多关于样式和主题的语法信息,请查看 Style Resource 文档。
想知道你在定义样式或主题时能使用哪些样式属性(例如,"windowBackground"或"textAppearance"),请查看R.attr或者相应的View class。