Android 用户界面---样式和主题(Styles and Themes)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
样式是给View或Window指定外观和格式的属性集合。
样式能够指定如高、边距、字体颜色、字体尺寸、背景颜色等属性。
样式被定义在一个与布局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的XML样式定义中,然后把它设置给style属性。
主题是应用与整个Activity或应用程序的样式,而不是一个独立的View对象。
当一个样式被用作主题时,Activity或应用程序中的每个View对象都会使用它所支持的每个样式属性。
例如,把相同的CodeFont样式用作一个Activity的主题,那么这个Activity内的所有文本都会使绿色等宽字体。
定义样式
要创建一个样式集,就要把一个XML文件保存项目目录的res/values目录中。
XML文件的名字是随意的,但是必须使用.xml扩展名,并且保存在res/values文件夹中。
这个XML文件的根节点必须是<resources>
对于要创建的每个样式,都要在这个XML文件中添加一个<style>元素,并永name属性唯一的标识这个样式(这个属性是必须的),然后给样式的每个属性添加一个<item>元素,这个元素的name属性用于声明样式的属性名,属性值被放在一组<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,当前样式可以继承这个指定样式的属性,然后如果需要,可以覆写被继承的样式属性。
请记住,把XML中定义的一个样式用作一个Activity或应用程序的主题与给一个View对象定义样式完全相同。
如上面示例中定义的样式能够被应用于一个View对象,或者用作一个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样式定义的所有样式,然后它覆写了android:textColor属性,把文本设置为红色。
使用@style/CodeFont.Red来引用这个样式。
通过用点把名字连接方法,可以实现样式的层次继承,如可以把上面的CodeFont.Red样式扩展成设置字体的样式:
<style name="CodeFont.Red.Big">
<item name="android:textSize">30sp</item>
</style>
这个样式继承了CodeFont和CodeFont.Red样式,然后添加了android:textSize属性。
注意:这种通过把名字连接在一起的继承性只对自己定义的样式有效。
不能用这种方法来继承Android内置的样式。
要引用内置的样式,如TextAppearance样式,就必须使用parent 属性。
样式属性
理解了样式是如何定义的之后,就需要学习<item>元素都定义了那些有效的样式属性类型。
你可能已经熟悉了像layout_width和textColor属性,但是还有更多的可以使用的样式属性。
查找应用于指定的View对象的最好的地方是对应的类参考,类参考中会列出所有的XML 所支持的属性。
例如,在TextView类的XML属性表中列出了所有的能够用于定义TextView 元素(或者它的一个子类)的样式。
在这个类参考中列出了一个属性:android:inputType,这个属性通常被放在<EditText>元素中,如:
<EditText
android:inputType="number"
... />
可以通过给EditText元素创建以下的样式定义来替代上例中android:inputType属性声明:<style name="Numbers">
<item name="android:inputType">number</item>
...
</style>
因此对于布局的XML可以使用以下方法来声明:
<EditText
style="@style/Numbers"
... />
这个简单的例子看上去有很多工作,但是当你要添加更多的样式属性,并且要在各种地方复用这些样式时,就会省去很多工作。
对于所有可用的样式属性,请参考R.attr类,要记住的是不是所有的View对象都接受R.attr 类中定义的所有的相同的样式属性,因此,通常应该给特定View对象指定其支持的样式属性。
但是,对于应用于一个View对象上的所有其不支持的样式属性,这个View对象只会使用它们所支持的那些属性,并简单的把不支持的属性忽略。
但是,有些样式属性不被任何View对象支持,只能用于主题。
这些样式属性应用与整个窗口,不真对任何View类型。
例如,能够隐藏应用标题的主题样式属性,隐藏状态栏或改变窗口背景的样式属性。
这些样式属性不属于任何View对象。
要查看这些仅用于主题的样式属性,请参考R.attr类中用window开始的属性。
例如,windowNoTitle和windowBackground 样式只会影响使用了这样的主题的Activity或应用程序。
注意:在每个<item>元素的声明中name属性的前缀名不要忘记使用android:命名空间,如<item name=”android:inputType”>
给UI应用样式和主题:
有以下两种方式来设置样式:
1.通过给XML中布局的一个View元素添加style属性,来给一个单独的View对象设置样
式;
2.或者,通过给Android清单文件中的<activity>或<application>元素添加android:theme属
性,来给整个Activity或应用程序添加主题。
当把一个样式应用于布局中单一的View对象时,这个样式定义的属性只会用于这个View 对象。
如果样式被用于一个ViewGroup对象,那么其中的View子对象不会继承这个样式属性---样式只会用于直接引用该样式的元素。
但是,通过样式主题,可以把一个样式应用与所有的View元素。
要把样式定义用于主题,就必须把这个样式用于Android清单文件中的<activity>或<application>元素。
这么做的时候,Activity或应用程序中的每个View对象都会应用它们所支持的属性。
例如,给一个Activity应用之前定义的CodeFont样式,那么这个Activity中支持这个文本样式属性的所有View元素都会使用这个样式,不支持这个属性的任何View对象会忽略它。
给View对象应用一个样式
以下是给XML布局中的一个View对象设置样式的方法:
<TextView
style="@style/CodeFont"
android:text="@string/hello"/>
这样TextView元素将会使用CodeFont中定义的样式。
注意:style属性不使用android:命名空间前缀。
给Activity或应用程序应用主题
要给应用程序的所有Activity设置主题,就要在AndroidManifest.xml文件的<application>元素中包含android:them属性,如:
<application android:theme="@style/CustomTheme">
如果要把一个主题只用于应用程序中的一个Activity,那么就要在<activity>元素中添加android:theme属性。
跟Android提供的其他内置资源一样,有一些系统预定义的主题可以使用,因此要避免自己编写它们。
例如,可以使用Dialog主题,让Activity的显示效果像一个对话框:
<activity android:theme="@android:style/Theme.Dialog">
如果要让背景透明,就使用透明的主题:
<activity android:theme="@android:style/Theme.Translucent">
如果要使用一个主题,但需要调整,那么可以把这个主题作为定制主题的父主题。
例如,可以修改传统的亮度主题,并添加自己想要的颜色:
<color name="custom_theme_color">#b0b0ff</color>
<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>
上例中需要的颜色是用独立的资源提供的,这是因为android:windowBackground属性仅支持对另一个资源的引用,跟android:colorBackground不一样,它不能接收颜色值的设定。
现在可以在Android清单文件内使用CustomTheme来替代Theme.Light。
基于平台版本来选择主题
比较新的Android版本中附带了一些应用程序可以利用的主题,并在这些平台上运行时,可能要使用这些主题,同时依然要兼容旧的版本。
基于不同的平台版本,通过选择定制主题所使用的资源在不同的父主题之间的切换来达到兼容的目的。
例如,以下是用标准的平台默认的亮度主题声明的一个简化的定制主题,它被放在res/values 文件夹下的一个XML文件中(通常是res/values/styles.xml):
<style name="LightThemeSelector"parent="android:Theme.Light">
...
</style>
当应用程序运行在Android3.0(API级别11)或更高的版本上时,针对这个主题要使用比较新的holographic主题,所以,要在res/values-v11的文件夹下的一个XML文件中放入一个可选的主题声明,把它的父主题设置为holographic主题:
<style name="LightThemeSelector"parent="android:Theme.Holo.Light">
...
</style>
现在就可以像平常一样使用这个LightThemSelector主题了,如果应用程序运行在Android3.0或更高的版本,就会自动的切换到holographic主题。
在R.styleable.Theme类中可以找到用于主题的标准属性列表。
有关提供可选资源的更多信息,如基于平台版本或其他设备配置的主题和布局,可以查看“Providing Resources”文档。
/guide/topics/resources/providing-resources.html
使用平台样式和主题
Android平台提供了一个大的用于应用程序的样式和主题集合。
可以在R.style类中找到所有可用的样式。
要使用其中列出的样式,就要用一个前缀来替换在样式名中的所有下划线。
如,可以用”@android:style/Theme.NoTitleBar”来替代Theme_NoTitleBar。
但是,R.style类文档没有完整的描述样式,因此查看实际的使用这些样式和主题的源代码会更好的帮助理解提供的每种样式属性。
为了更好的引用Android的样式和主题,请看下列源代码:
1.Android样式(styles.xml)
2.Android主题(themes.xml)
这两个文件会通过例子帮助你设计,例如,在Android主题的源代码中,能够找到<style name=”Theme.Dialog”>声明。
在这个定义中,可以看到所有的Android框架使用的对话框样式属性。