Android 风格和主题

或许你对标准工具的外表不是那么满意。为了解决这个问题,你可以创建你自己的风格和主题。
• 风格是一套包含一个或多个格式化属性的整体,你可以把它们加诸于你布局中的单个元素之上。
比如 , 你可以定义一个包含特定文本字体大小和颜色的风格 , 并将它单独施用于特定的视图元素 。
• 主题也是一套包含一个或多个格式化属性的整体,但却应用于一个应用程序中的所有 Activity ,
或单独一个 Activity 。比如说,你可以定义一个包含了特定窗口边框颜色和版面背景、以及一套
字体大小和菜单颜色的主题。 这个主题可以施用于特定的 Activity 抑或整个应用程序。
风格与主题隶属于资源。 Android 提供了一些默认的风格和主题供你使用,你也可以定制你自己的风格和

主题资源。

Style和Theme的XML文件结构:
对每一个Styles和Themes,有一个<resources>根节点,给<style>元素增加一个全局唯一 的名字,也可以选择增加一 个父类属性。在后边我们可以用这个名字来应用风格,而 父类属性标识了当前风格是继承 于哪个风格。在<style>元素内部,申明一个或者多个<item>,每一个<item>定义了一个名字属性,并且在元素内部定义了这个风格的值。

风格Styles :
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="formatTextStyle" parent="@android:style/TextAppearance">
        <item name="android:textSize">28sp</item>
        <item name="android:textColor">#900</item>
    </style>
</resources>如上所示,你可以用<item>元素来为你的风格定义一组格式化的值。在Item当中的name属性可以 是一个字符串,一个16进制数所表示的颜色或者任何其他资源的引用。

Theme依然在<style>元素里边申明,也是以同样的方式引用。不同的是通过在Android Manifest中定义的<application>和<activity>元素将主题添加到整个程序或者某个 Activity,但是主题是不能应用在某一个单独的View里。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme"> 
<item name="android:windowNoTitle">true</item>
<item name="windowFrame">@drawable/screen_frame</item>
<item name="windowBackground">@drawable/screen_background_white</item>
<item name="panelForegroundColor">#FF000000</item>
<item name="panelBackgroundColor">#FFFFFFFF</item>
<item name="panelTextColor">?panelForegroundColor</item>
<item name="panelTextSize">14</item>
<item name="menuItemTextColor">?panelTextColor</item>
<item name="menuItemTextSize">?panelTextSize</item>
</style>
</resources>
注意:我们用了@符号和?符号来引用资源。地址符@表明我们引用的资源是其它地方定义过的(也许在这个项目中或者在Android框架中)。问号符?表明我们引用的资源的值在当前加载的主题中。这通过以名字引用特定的<item>来完成(比如,panelTextColor使用了分配给panelForegroundColor的相同颜色)。这种技巧只能用在XML资源当中。

在manifest中设置主题Set the theme in the manifest : 
为了给应用程序所有的活动设置主题,你可以打开清单文件AndroidManifest.xml,编辑<application>标签,让其包含android:theme属性,值是一个主题的名字,如下:

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


Android中提供了几种内置的资源,有好几种主题可以用于切换而不用自己写。如果你只是想让你程序当中的某个Activity拥有这个主题,那么你可以修改<activity>标签。就像Android提供的其他内置资源一样,有好几种主题你可以切换而不用自己写。比如你可以用对话框主题来让你的活动看起来像一个对话框。在manifest中,像下面这样引用一个Android主题:
<activity android:theme="@android:style/Theme.Dialog">

如果你喜欢一个主题,但是想做一些轻微的调整,你只需要将这个主题添加为父主题。比如,我们将修改Theme.Dialog主题。为此,创建一个风格以Theme.Dialog为父主题:
<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
就这样,我们已经继承了Android对话框主题,因此我们可以按照自己的意愿来调整主题。这样,对于这个对话框主题中每个我们想要改变的item,我们可以在这里重新定义它的值然后在Android Manifest 文件中使用CustomDialogTheme而不是Theme.Dialog。 


在程序当中设置主题Set the theme from the application : 
如果需要的话,你还可以以编程的方式来给一个活动加载主题。为此,要使用setTheme()方法。

注意:这样做,你应该在初始化任何上下文中的视图之前设置主题。比如,在用setContentView(View)或者inflate(int, ViewGroup)方法前。这确保系统将当前主题应用在你所有的用户界面屏幕上。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
setTheme(android.R.style.Theme_Light);
setContentView(R.layout.linear_layout_3);
}
如果你打算在程序代码中来加载主界面的主题,那么需要注意这个主题将不能应用于任何系统用来启动这个活动的动画,这些动画将在应用程序启动前发生。在大多数情况下,如果你想将主题应用到你的主界面,在XML中定义是一个更好的办法。

Android平台的样式和主题

样式见:http://www.ideasandroid.com/android/sdk/styles.xml
主题见:http://www.ideasandroid.com/android/sdk/themes.xml


注: 1. 当style 应用到一个View上时,由此style定义的属性会仅应用于那个View。如果一个Style应用到一个ViewGroup上,那么子View元素并不会继承此Style属性------仅有你直接应用了Style的元素才会用其属性。然而,可以通过作为Theme来应用的方式应用一个Style到所有的View.如果该View 不支持的Style中的属性,则该属性被忽略,它只是应用其所支持的属性

          2.样式的继承
这里有两种方式可以实现样式继承,如上例中所示的,我们可以在定义样式时使用parent属性来继承样式,使用这种方式,我们可以继承一个我们自己定义好的样式,也可以继承一个android平台自带的样式(后文中会介绍android平台自带的所有样式)。如下所示,我们继承一个android平台默认的文本样式,并把它的字体颜色改为我们需要的颜色。

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

另一种继承的方式是使用用户自定义的样式作为前缀即可。这种方式只适用于继承用户自定义样式。如下所示:

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

这样,新定义的样式就会继承CodeFont样式的所有属性,然后把字体颜色变为#FF0000。我们可以这样引用新的样式: @style/CodeFont.Red
相同的方法,我们可以再继承下去,如下所示:

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

这样新的样式文子的大小就和CodeFont.Red样式不同了。


引用主题属性 References References References References to to to to Theme Theme Theme Theme Attributes Attributes Attributes Attributes
另外一种资源值允许你引用当前主题中的属性的值 。 这个属性值只能在样式资源和 XML 属性中
使用;它允许你通过将它们改变为当前主题提供的标准变化来改变 UI 元素的外观,而不是提供
具体的值。
如例中所示 , 我们在布局资源中使用这个特性将文本颜色设定为标准颜色的一种 , 这些标准的颜
色都是定义在基本系统主题中。
<?xml version="1.0" encoding="utf-8"?>
<EditText id="text" xmlns:android=" http://schemas.android.com/apk/res/android "
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="?android:textDisabledColor"
android:text="@string/hello_world" />
注意,这和资源引用非常类似,除了我们使用一个 “ ? ” 前缀代替了 “ @ ” 。当你使用这个标记时 , 你
就提供了属性资源的名称 , 它将会在主题中被查找 —— 因为资源工具知道需要的属性资源 , 所以
你不需要显示声明这个类型(如果声明,其形式就
是 ?android:attr/android:textDisabledColor ) 。
除了使用这个资源的标识符来查询主题中的值代替原始的资源, 其命名语法 和 “ @ ” 形式 一
致 : ?[namespace:]type/name , 这里类型 可选。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值