API/Guides/User Interface/Styles and Themes 翻译

来源:互联网 发布:mac beta是什么意思 编辑:程序博客网 时间:2024/06/05 19:35
原文链接:

Styles and Themes

样式是指一系列关于设图和窗口的格式或者界面的属性组合。一种样式能够确定设图的高度,填充,字体颜色,字体大小,背景颜色等等。一种样式被定义在一个XML资源文件里面,该文件和指定布局的XML文件不同。

Android中的样式和web设计中的层叠样式理念一样-----他们允许你将设计和内容分开。

比如,通过使用一种样式,你可以在布局XML里面做这样操作:

<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里面移除,都定义在一个叫做CodeFont的样式里面。下面你将会看到如何定义该样式。

一个主题是被用在整个Activity或者应用里面的样式,而不仅仅是单独的设图(如上面例子),当一个样式被应用做主题,在Activity和应用中所有视图都会采用该样式的属性。比如,你可以将CodeFonty样式用作一个Activity的主题,那么,所有在该Activity中的文本都会是绿色等宽字体。


定义样式

在你工程res/values/目录下面,创建一系列样式的XML文件。文件名是任意的,但必须,以".xml"作为扩展名,并且保存在res/values目录下面。

XML文件里的根节点必须是<resources>.

在你想创建的样式里面,添加一个<style>元素到该文件里面,并且携带一个可以唯一标识该样式的名字(这是必须的)。然后增加一个<item>元素,代表这个样式里面的每个属性,并且携带一个申明该属性的名字,和一个属性的值(这是必须的)。对于<item>里面的值,可以是一个关键字符串,一个十六进制的颜色值,一个指向另一个类型资源的引用,或者其他值。
下面就是一个简单的样式的例子:

<?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>

每一个<resources>里面的子元素,都会在编译时候被转化为一个应用的资源对象,当使用<style>中元素属性name时即可引用该对象。比如,在一个XML布局文件里面,使用@style/CodeFont(前面介绍过的)即可引用该样式。

在<style>元素内 parent属性是可选的,它指定了被继承的样式的ID. 如果需要,你也可以覆盖被继承样式中的属性。

记住,当一个样式被用在一个Activity或者一个应用时候,或者应用在单个视图上面,都是一样的。就像上面定义的那个样式一样,既可以用在单个试图上面,也可作为一个Activity或者应用的主题。后续会讨论一个样式怎么应用在单个试图,或者应用的主题。

继承


在<style>元素中parent  属性,指定了你要继承的样式。你可以继承已经存在的样式,只需定义你想修改或者添加的属性。你既可以继承自定义的样式,也可以继承系统默认创建的样式。比如。你可以继承Android平台默认的文本样式,然后修改它:

   <style name="GreenText" parent="@android:style/TextAppearance">        <item name="android:textColor">#00FF00</item>    </style>

当你想要继承你自定的样式时候,你不必 使用parent  属性,只需将被继承的样式名字作为新的样式名字的前缀,中间用"."隔开。比如,创建一个新的样式继承CodeFont,但是修改颜色为红色,你可以如下操作:

    <style name="CodeFont.Red">        <item name="android:textColor">#FF0000</item>    </style>

注意,当<style>里面没有parent 属性标志时候,但是,name却以CodeFont样式名字作为开始,这个样式将继承所有CodeFont样式的属性。 你也可以@style/CodeFont.Red 创建一个新的样式,覆盖android:textColor  属性,使得文字颜色为红色。

你也可以通过链接名字这种方式实现多次继承。比如,你可以扩大 CodeFont.Red

<style name="CodeFont.Red.Big">        <item name="android:textSize">30sp</item></style>

这个继承了  CodeFont 和 CodeFont.Red 样式 ,然后添加了android:textSize  属性。

 注意: 这种通过链接名字的方式只允许集成你自定义的布局资源。不能在继承Android系统资源中使用,在该种情况下,必须使用 parent 属性。

样式属性

现在既然都已经掌握了如何定义一个样式,接下来需要掌握样式中哪些属性是能用的。你可能对于layout_width,textColor这些属性比较熟悉,当然,还有其他已经有使用过的属性。

寻找某个指定的视图所支持的属性,最好去它相关的类里面,里面罗列了该试图所支持的所有属性。比如,在TextView XML attributes 罗列了所有 TextView 元素(或它的子类)所支持的属性。其中一个属性 android:inputType ,你可以在一个<EditText> 里面放置该属性:

<EditText    android:inputType="number"    ... />

你可以为 EditText 元素创建一个新的样式,包含这个属性:

<style name="Numbers">  <item name="android:inputType">number</item>  ...</style>


因此,你的XML布局文件可以实现该样式:

<EditText    style="@style/Numbers"    ... />


上面的例子看起来很高效,但是当你添加更多样式属性在不同的地方重用该样式,代价是很大的。

R.attr  引用中包含了所有有效的样式属性。记住,所有的视图对象都不会支持同样的属性,你可以到指定的视图里面看到相关支持的属性。但是,当你在一个试图里面使用它不支持的属性时候,试图会只引用它支持的属性,忽略不支持的部分。

一些样式属性,虽然不被任何视图支持,却可以运用到主题中。这些属性被应用到整个窗口。比如,一些主题支持视图却不支持的样式属性:隐藏标题,隐藏状态栏,或者修改窗口背景。
在 R.attr中可以看到,那些以window开头的属性,都只是主题属性。比如,windowNoTitle 和 windowBackground只被应用到主题。下一节介绍如何将一样式应用到主题。

 注意: 在每个<item> 元素里面,属性名字都是以android:命名空间作为前缀,比如,<item name="android:inputType">.

在UI中使用样式和主题

设置样式有两种方式
 (1)对于单个视图来说,在你的布局XML文件里面,添加  style属性到你的试图元素里面。
 (2)或者,对于一个Activity 和一个应用来说,在 AndroidManifest里面添加 android:theme属性到对应的<activity><application>元素里面。

当你在布局里面单个视图引用一个样式,样式的属性只会被那个视图所引用。如果一个样式被引用到一个视图组,子的视图不会继承这些属性,只有你指定引用的子视图才会继承。但是,通过将该样式引用作为一个主题,所有试图对该样式即可有效。

将一个样式作为一个主题使用,你必须在AndroidManifest中的一个Activity 或者应用中添加该样式。当你这样做后,所有视图都会采用样式中它所支持的属性。比如,你将CodeFont样式 作为一个Activity的主题,所有视图支持文本样式的属性都会有效。所有不支持样式属性的视图都会忽略掉。假如一个视图只支持一些属性,那它将只采用这些属性。

对于单个视图采用样式

这里是对一个视图设置一个样式的例子:

<TextView    style="@style/CodeFont"    android:text="@string/hello" />

现在,TextView将会采用CodeFont的样式属性。

注意: style属性不需要使用 android: 命名空间作为前缀。


Activity或者应用中使用样式

对所有activities或者应用设置样式,打开AndroidManifest.xml 文件,编辑<application> 标签,让它包含  android:theme属性,携带样式的名字。比如:

<application android:theme="@style/CustomTheme">

如果你将该主题只是应用到某个Activity里面,只是添加  android:theme属性到<activity> 标签里面即可。


 
原创粉丝点击