Styles and Themes

目录:
1.定义样式
2.继承
3.样式的属性
4.在UI中应用样式和主题
5.在View上应用样式
6.在Activity或应用程序上使用样式
7.基于平台版本上选择一个主题
8.使用系统样式和主题

样式就是View或窗口 的属性的特定显示和格式的集合。样式能够设置的属性,包括高度,间距,字体颜色,字体大小,背景颜色,等等。样式被定义在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" />

所有与样式相关的属性都从布局文件中移除到被定义的CodeFont样式中。你将会在下面看到被定义的样式。

主题就是应用在整个Activity或者应用程序中的 样式,而不是单独应用在View中。当一个样式被用作主题,那么在Activity或应用程序中所有的View都会使用该样式提供的属性。例如:在一个Activity中你能够使用同一个 CodeFont样式作为主题,该Activity中的所有text都有相同的字体。

1:定义样式

新建一个样式,以xml文件形式保存在你的工程res/values目录下。这个xml文件的名字可以任意取,但是必须以.xml格式结尾,而且放在res/values目录下。

这个xml文件的根节点必须是<resources>。

在为你每个想要创建样式中,增加一个<style> 元素,并带有name 作为唯一的id标识符。然后为每个style元素的属性增加<item>元素,每个item带有name声明样式中的属性,和相应的value。这个value能够是字符串,六位数的颜色值,别的相关的资源类型,或者依赖于其他样式的属性。例如:

<?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>元素的value都能被引用。
<style> 元素中 parent 的属性是可选的,你可以指定一个另外样式的id,用来继承属性。如果你想的话,可以重写继承样式中的属性。

记住,你想在一个Activity或者应用程序主题中使用样式和在View中使用样式完全一样。如上所定义的样式能够被用于单个View或者是整个Activity和应用程序中的主题。稍后我们将讨论怎样在单个View上或应用程序主题上使用样式。

2:继承

在<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。
你还可以继续这样继承几次,通过点连接名称。例如:

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


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

3:样式属性

现在你已经知道了如何定义样式,你需要了解什么样的样式属性被定义在<item>元素中,是可用的。你可能已经熟悉了一些,比如layout_width 和 textColor。当然,这里还有更多样式属性你能够使用。

查看一个视图可以支持哪些属性,最好的地方是它对应的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或者应用程序中使用主题


为了给你应用程序中的所有的Activity设置一个主题,你需要打开AndroidManifest.xml文件,并且在<application>标签中编辑,在android:theme 属性上指定一个样式名称。例如:

<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>
<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>
注意:这个color需要提供单独的支持,因为 android:windowBackground 属性仅支持其它资源的引用;


现在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">
   
...
</style>
现在按照一般方式使用这个主题,当你的应用程序运行在android 3.0 或者更高时,你的应用程序会自动切换到全息主题。

你可以在R.styleable.Theme上找到一张关于你能在主题中使用的标准属性表。

想要知道更多关于根据平台版本或者设备配置提供可选资源,比如主题,布局等,你可以在Providing Resources文档中查看。


8:使用系统样式和主题

android 平台提供了大量的样式和主题,你可以应用在你的应用程序中。你可以在R.style 类中找到所有的可用的样式参考。为了使用那些样式列表,你需要把下划线替换为点。例如,你可以通过“@android:style/theme.NoTitleBar”使用Theme_NoTitleBar 主题。


然而,这份 R.stytle 参考并不是一份好的文档,而且描述的不全面。但是,通过阅读关于这些样式和主题的真实代码可以让你更好的理解它们提供了哪些属性。想更多的了解Android 样式和主题,请阅读下面的源代码:

      Android Styles(styles.xml)
      Android Themes(themes.xml)

这些文件会通过例子来帮助你理解。例如,在Android themes源代码中,你会找到<style name="Theme.Dialog">声明。在这个定义中,你会发现所有用于样式对话框的属性都用于Android框架。

想知道更多关于样式和主题的语法信息,请查看 Style Resource 文档。

想知道你在定义样式或主题时能使用哪些样式属性(例如,"windowBackground"或"textAppearance"),请查看R.attr或者相应的View class。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值