android的样式(style)与主题(theme)

Android上的Style分为了两个方面: 

1,Theme是针对窗体级别的,改变窗体样式; 
2,Style是针对窗体元素级别的,改变指定控件或者Layout的样式。 

Android系统的themes.xml和style.xml(位于系统源代码frameworks\base\core\res\res\values\)包含了很多系统定义好的style,建议在里面挑个合适的,然后再继承修改。


风格是一个包含一种或者多种格式化属性的集合,你可以将其用为一个单位用在布局XML单个元素当中。比如,你可以定义一种风格来定义文本的字号大小和颜色,然后将其用在View元素的一个特定的实例。

主题是一个包含一种或者多种格式化属性的集合,你可以将其为一个单位用在应用中所有的Activity当中或者应用中的某个Activity当 中。比如,你可以定义一个主题,它为window frame和panel 的前景和背景定义了一组颜色,并为菜单定义可文字的大小和颜色属性,你可以将这个主题应用在你程序当中所有的Activity里。

风格和主题都是资源。你可以用android提供的一些默认的风格和主题资源,你也可以自定义你自己的主题和风格资源。
如何新建自定义的风格和主题:
1.在res/values 目录下新建一个名叫style.xml的文件。增加一个根节点。
2.对每一个风格和主题,给

 
如上所示,你可以用元素来为你的风格定义一组格式化的值。在Item当中的名字的属性可以是一个字符串,一个16进制数所表示的颜色或者是其他资源的引用。
注意在

注意我们用了@符号和?符号来应用资源。@符号表明了我们应用的资源是前边定义过的(或者在前一个项目中或者在Android 框架中)。问号?表明了我们引用的资源的值在当前的主题当中定义过。通过引用在里边定义的名字可以做到( panelTextColor 用的颜色和 panelForegroundColor中定义的一样)。这中技巧只能用在XML资源当中。
在manifest当中设置主题
为了在成用当中所有的Activity当中使用主题,你可以打开AndroidManifest.xml 文件,编辑 标签,让其包含android:theme属性,值是一个主题的名字,如下:
如果你只是想让你程序当中的某个Activity拥有这个主题,那么你可以修改标签。
Android中提供了几种内置的资源,有好几种主题你可以切换而不用自己写。比如你可以用对话框主题来让你的Activity看起来像一个对话框。在manifest中定义如下:
如果你喜欢一个主题,但是想做一些轻微的改变,你只需要将这个主题添加为父主题。比如我们修改Theme.Dialog主题。我们来继承Theme.Dialog来生成一个新的主题。
   
    
  •  "CodeFont.Red.Big">  红色,并且大字体  
  •         "android:textSize">30sp   
  •    
  • 也可以继承平台的style,可继承的样式请参照绍docs/guide/topics/ui/themes.html#PlatformStyles

    1. "CodeFont" parent="@android:style/TextAppearance">   

    如果父样式的值不符合你的需求,你也可以对它进行修改,和CSS中的覆盖效果一样,都是以最后的为准,  

    在style中可以定义的属性
    都有哪些属性在style的定义里是有效的呢?具体请参考docs/reference/android/R.attr.html
    在view上使用style时,对view有效的属性起作用,无效的则会忽略
    有一些属性对view无效,只对theme有效,在R.attr定义中以window开头的一些属性只对theme有效

    style的使用
    如果给view指定style,那么这个style只对该view有效
    如果给viewgroup指定style,那么viewgroup下的元素也不会应用这个style,除非特别指定
    给view指定style时,没有android:前缀,而只是style

    下面是具体用法:

    首先在res/values下新建一style.xml文件:

    1. "1.0" encoding="utf-8"?>  
    2.   
    3.     "TitleStyle">  
    4.         "android:textSize">18sp  
    5.         "android:textColor">#ec9237  
    6.       
    7.     "Title" parent="@style/TitleStyle">  
    8.         "android:textSize">5sp  
    9.       
    10.   

    在layout.xml中的应用:

    1. "wrap_content"   
    2.     android:text="EditText"   
    3.     style="@style/Title"  
    4.     android:layout_width="fill_parent"   
    5.     android:id="@+id/editText1">  

    其实style就像是一组属性的组合, 可以看做当在view中引用style时,是顺序执行style中的item里面的每个属性,对view进行设定而已。因为可能有多个view都是需要设置相同的属性,。所以把这些view的属性单独写出,提高重用性。 

    theme:就像风格一样,主题依然在  

  •   
  • 下面代码显示在AndroidManifest.xml中如何为应用设置上面定义的主题:

    1. "@drawable/icon" android:label="@string/app_name"    
    2.     android:theme="@style/theme1">    
    3.     ".MessageShowActivity" android:label="@string/app_name"    
    4.         android:windowSoftInputMode="adjustPan" android:screenOrientation="portrait"    
    5.         android:theme="@style/theme2">    
    6.         
    7.   

    除了可以在AndroidManifest.xml中设置主题,同样也可以在代码中设置主题,如下:

    setTheme(R.style.theme1);

    注意:我们用了@符号和?符号来应用资源。@符号表明了我们应用的资源是前边定义过的(或者在前一个项目
    中或者在Android 框架中)。问号?表明了我们引用的资源的值在当前的主题当中定义过。

    style和theme的区别:

    尽管在定义上,样式和主题基本相同,但是它们使用的地方不同。样式用在单独的View,如:EditText、TextView等;主题通过AndroidManifest.xml中的用在整个应用或者某个 Activity,主题对整个应用或某个Activity存在全局性影响。如果一个应用使用了主题,同时应用下的view也使用了样式,那么当主题与样式属性发生冲突时,样式的优先级高于主题。

    另外android系统也定义了一些主题,例如:

    ,该主题可以让Activity看起来像一个对话框,

    Variant of the light theme with no title bar,系统自带的黑色主题。如果需要查阅这些主题,可以在文档的reference-->android-->R.style 中查看。



    ==================================================================================================



    Android学习笔记之Styles andThemes

    一、前沿    

    通过使用style和theme可以将

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

        android:textColor="#00FF00"

        android:typeface="monospace"

    android:text="@string/hello"/>

    改写为:

        style="@style/CodeFont"

       android:text="@string/hello" />

    style应用于某一固定的View,Theme应用于整个的Activity或者Application

    二、定义Style

             Style需定义在/res/values下的xml文件中。例如:

       

    2.1 style的继承

             如果要继承android内置的style需要定义parent属性,如上面所示。如果需要继承自定义的style则不需要parent属性。name中表明即可。如下,该style继承了自定义的name为CodeFont的style,并重写了一些属性:

           30sp

           #FF0000

     

            

    三、在UI上应用style和theme

    3.1 在view上应用style

        style="@style/CodeFont"

       android:text="@string/hello" />

    3.2 在activity或application上应用theme

    android:theme="@style/CustomTheme">

    如果想使activity具有Dialog的风格的话,可以这样:

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

    想让背景透明的话,可以:

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

    如果想定制系统自带的theme的话,可以:

    #b0b0ff

    上面的例子中引用了另一个color资源,因为属性android:colorBackground只支持引用。

    3.3 根据平台版本自动选择theme

             根据平台不同自动切换theme,比如定义了theme:

    如果想让该theme在version11中变换style,可以在res/velues-11下定义xml文件,包含如下内容:

    四、使用自带的style和theme

    Android自带了大量的style和theme供选择使用,也可以个性化定制

     

     


    你可能感兴趣的:(Android)