您的位置:首页 > 移动开发 > Android开发

Android系统Styles and Themes

2016-08-03 10:22 274 查看
 本文简要介绍andorid Styles和Themes相关内容。

样式和主题

样式是一指定视图或窗口的外观和格式的属性集合。样式可以指定属性,如高度,填充,字体颜色,字体大小,背景颜色,以及更多。样式被定义在一个单独的XML指定布局的XML资源。

Android中的样式和网页设计中的级联样式表有着相同的设计理念—他们允许你将内容和设计分开。

例如:通过使用样式,你可以使用这样的样式布局:

  将他们修改成:

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


所有和样式相关的属性被从该布局文件中移除,而被放入一个叫做CodeFont的样式定义文件中,这样就可使应用相同的样式属性。

主题是一中应用到整个Acitvity或应用程序的风格,而不是一个单独的视图(在上面的例子)。当样式作为一种主题应用,那么在每一个activity和应用程序的中的视图如果支持对应的样式,都会生效。例如,你可以将同样的CodeFont应用在一个Acitvity中,然后该Acitvity内部的所有文本,都会显示成绿色等宽字体。

定义样式

要创建一组样式,那么要在你的项目中的res/valuses/目录下创建一个xml。 XML文件的名称是任意的,但必须使用.xml扩展名并保存在res/values/文件夹。

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

对于每一个你要创建的样式,添加一个<style>标签并用名字来表示样式的在该文件中的唯一性(这个属性是必要的)。然后为样式的每一个属性添加一个<item>,并且名字来声明它的属性以及对应的属性值(这个属性也是必要的)。<item>对应的键值可以是String,16进制颜色,其他资源类型的引用,或者符合该属性的其他值。下面是一个简单的样式事例:

<?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>对应的名字属性来调用。这个事例中的style可以在布局文件中通过

@sytle/CodeFont(正如上面显示的那样)来使用。 

parent 属性在<style>元素中是可以选择的并且指定了对应资源id,从这个id对应的资源中,要继承对应的属性。同样如果你愿意,你可以根据需要修改对应的的属性值。 

记住,要在Acitvity或应用程序使用主题,那么在XML中定义主题被应该和view对应style一样。上述定义的样式,如可以应用于作为一个单一的视图样式或作为整个activity或者应用程序的主题。如何在单一视图或应用程序使用的样式和主题将在后面讨论。

继承

在<style>元素中对应的<parent>属性,允许你指定一个样式,从这个样式中你继承它对应的属性。你可以使用该属性,继承那些已经存在的属性,这样只需要增加或者修改某些属性即可,那些可以继承的样式可以是你自己定义的或者平台本身定义的。例如,你可以继承android平台默认的字体显示,并且修改它:

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


如果你想继承你自己定义的样式,那么你没有必要使用parent属性,而仅仅需要把你自己的定义的属性名字作为新定义的属性名字的前缀,并用“。”分开,例如,

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


注意到上面这个例子中在style标签中没有对应的parent属性,但是由于名字属性是一个CodeFont 的样式名(这是一个你自己定义的样式)为前缀,这个样式继承了CodeFont的所有定义的属性,并且这个属性重写了android:textColor属性,让字体颜色成为红色,你可以使用 
@style/CodeFont.Red
.来调用这个新的样式。

你可以通过“.”来实现多次继承,例如,你可以继承CodeFont.Red

来实现bigger:

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


这个样式同时继承了CodeFont和CodeFont。Red,并且添加了android:textSize属性

 

注意:通过“.”来把样式继承起来,仅仅当这些样式是你自己定义的才能生效,而不能通过这种方式继承android本身自带的样式,例如Textappearance,要继承这类样式,你必须使用parent属性

样式属性

现在既然了解了如何定义一个样式,那么就需要学习在定义样式时那些属性——用<item>元素定义的属性——是可用的。你可能对其中的一些已经很熟悉了,例如layout_widthtextColor。当然,还有很多的属性可以使用。

 

相应的参考类中列举了该类支持的所有xml属性,这里是找对应视图显示属性的最好的地方。例如,在TextView XML表列举的属性都能在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.ttr.文件,来获取所有可用的样式属性,但是必须铭记,不是所有的视图对象都会接受所有相似的属性,所以,一般情况下,你得查看对应视图类来获取某个特定类支持的样式属性。但是,如果对一个视图应用了它不支持的样式属性,那么只有那些它支持的才会生效,而忽略那些不支持的属性。

 

然而,还有一些属性不被任何视图支持,而仅仅只能被应用到主题当中,这些样式属性,将会在整个窗口中生效而不是任何的视图中,例如,那些可以隐藏应用题目,隐藏状态栏,或者改变窗口背景。这类样式属性不属于任何视图对象,要了解这了样式属性,可以查看R.arrt中那些以window开头的属性,例如, windowTitle和windowBackground这两个属性就是当一个样式被作为一个主题应用在activity或者应用时才能生效的。下一个部分将介绍有关如何应用一个样式和主题。

 

注意:不要忘了在每一个<item>元素中以android:名空间开头的属性名字,,例如 :
<itemname="android:inputType">
.

如何使用样式和主题

有两种方式设置一个样式:

>  对一个一个单独的视图,通过在布局文件的视图属性中增加style属性

>   对于一个Activity或者应用,通过在android的manifest中的<activity>或者<application>元素中添加android:theme属性。

 

当你在布局文件中针对某一个视图使用样式,那么那些在样式中定义的属性,将会在这个视图中生效。如果样式被应用在一组视图中,那么子视图是不会继承这些样式属性的—也就是说只有被这些样式直接修饰的属性才能生效。但是有一种方法可以使一个样式对所有视图都生效,那就是把这些样式作为一个主题使用。

 

要把一个样式定义作为一个主题使用,那么就要用这个样式来修饰android manifest中的activity和application元素。如果你这样做,那么该activity或者应用中的每一个视图都会生效自己支持的属性。例如,如果你把CodeFont样式使用在一个Activity上,那么在这个应用中的所有文字的样式都会生效这种样式。其他的那些不支持的样式属性将直接被忽略。一个视图只会生效那些它自己支持的属性。

对视图使用样式

下面是一个在xml布局文件中使用样式的例子:

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


现在,这个TextView将会显示成上面CodeFont定义的那种样式。

 

注意:这个样式属性没有使用android:前缀属性

 

对activity和application使用样式

对一个application的所有Acitvity使用主题,那么就要在androidManifext.xml中的application标签中包含android:theme属性,例如:

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


如果你只是想正对某一个activity使用样式,那么你只需要在对应的<activity>标签中添加android:theme属性

 

正如android提供了一些原生的资源一样,android同样也提供了一些预制的主题供用户使用,从而避免用户定义,例如,你可以使用dailog主题,来使你的activity看起来像一个dailog框,例如

<activity android:theme="@android:style/Theme.Dialog">


或者你想是你的应用的背景是透明的,那么你可以使用透明主题

<activity android:theme="@android:style/Theme.Translucent">


如果你想使用主题,但是又想修改,那么只需要在主题中加入parent属性,例如:你可以修改原生的light主题,从而使它使用自己定义的颜色:

 

<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:background属性仅仅支持将其他资源的引用作为值,而不像android:colorBackground,不能将一个16进制的颜色值赋给它)

 

现在可以在androd manifest中使用CustomTheme来替代Theme,Light.

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


如何根据一个平台版本选择一个主题

新的android平台已经提供针对application的主题,你也许想在这些平台上使用它,但同时,也希望他能支持那些老版本。你可以通过一个根据平台版本来实现资源切换的自主定义主题来实现。

 

例如,下面是一个用户自主定义的主题,这个主题是一个标准的默认light主题,这个主题将调用一个res/values/目录下的xml文件(一般是res/values/styles.xml):

<style name="LightThemeSelector" parent="android:Theme.Light">
    ...
</style>


为了使该应用程序运行在android 3.0(api level 11)或者更高版本上时使用holographic主题,你可以在res/values-v11目录下放置可选的主题,但是确保该主题继承于holographic主题

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    ...
</style>


现在你可以像使用其他样式一样使用这个主题,并且当运行平台是android 3.0或者更高时,它会自动切换到holographic主题上。

 

所有可以在theme中使用的标准属性都包含在R.styleable.Theme中。 

Android平台提供了大量的可选的样式和主题,来满足用户在自己的应用程序上使用。你可以在R.style类中找到所有可以使用的样式的引用。要使用这些样式,你只需要用“.”来替换名字中的下划线,例如,你可以像这样使用Theme_NoTitleBar主题:
"@android:style/Theme.NoTitleBar"
.

使用平台相关的样式和主题

然而,R.style
并不是一份好的文档,同时也没有对样式进行详细的描述,因此,查看样式和主题对应的源代码将会使我们对android提供的每一个样式属性有一个深入的理解,更加详细的android样式和主题,可以查看如下源代码:

 

/frameworks/base / core / res / res / values /
styles.xml

/frameworks/base / core / res / res / values /
themes.xml

后记

该文档资料仅供参考,如有不足之处,请指正.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: