码迷,mamicode.com
首页 > 移动开发 > 详细

android-样式(style)和主题(theme)

时间:2015-08-01 15:54:11      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

     如果我们经常需要对某个类型的组件指定大致相似的格式,比如字体、颜色、背景色等,如果每次都对view组件重复设置这些属性,这无疑增大了工作量,而且不利于项目的后期维护。

    其实android里面的style有点类似css,如果有网站开发经验的同学,来理解style来说,是比较好理解的。

样式资源

    Android的样式资源文件也放在/res/values目录下,样式资源文件的根元素是<resource.../>元素,而且在<resource../>中又可以包括多个<style.../>子元素,每个<style../>元素定义一个样式。style元素定义有以下属性:

    

name : 指定样式的名称
parent :指定样式所继承的父样式,当继承某个父样式时,该样式将具有父样式中定义的所有格式。当然,当前样式也可以覆盖父样式中的格式。
<style.../>元素内可以包含多个<item.../>子元素,每个<item.../>子元素定义一个格式项

  例如如下实例: 

<?xml version="1.0" encodig="utf-8"?>
<resource>
    <style name="style1">
        <item name="android:textSize">20sp</item>
        <item name="android:textColor">#00d</item>
    </style>
    <style name="style2" parent="style1">
        <item name="android:background">#ee6</item>
        <item name="android:padding">8dp</item>
        <!--覆盖父样式中指定的属性-->
        <item name="android:textColor">#000</item>
    </style>
</resource>

上面的样式资源中定义了两个样式,其中第二个样式继承了第一个样式,而且第二个样式中的textColor属性覆盖了父样式中的textColor属性。

一旦定义了上面的样式资源后,接下来就可以在XML资源中按照如下语法格式来使用样式了:

@[<package_name>]style/file_name

下面是该实例中的界面布局文件,该布局文件中包含两个文本框,这两个文本框分别使用两个样式。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/style1"
        android:text="@string/style1"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/style2"
        android:text="@string/style2"/>
</LinearLayout>

上面的界面布局文件中,并未为两个文本框指定恩和格式,只是为他们分别指定了使用style1.style2的样式,这两个样式包含的格式就会应用到这两个文本框。

主题资源

与样式资源非常相似,主题资源xml文件通常也放在res/values目录下,主题资源的XML文档同样以<resource.../>元素作为根元素,同样使用<style.../>元素来定义主题。

主题和样式的区别体现在:

  • 主题不能作用于单个的View组件,主体应该对整个应用综的所有Activity起作用,或对指定的Activity起作用

  • 主题定义的格式应该是改变窗口外观的格式,例如窗口标题。窗口边框等

实例:给所有窗口添加边框、背景                                                                                                                                   

下面通过一个实例来介绍主题的用法。为了给所有窗口添加边框、背景、先在/res/values/my_style.xml文件中添加一个主题,定义主体的<style.../>片段如下:

<?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="Crazy_theme">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowFrame">@drawable/abc_btn_check_material</item>
        <item name="android:windowBackground">@drawable/abc_btn_check_to_on_mtrl_015</item>
    </style>
</resources>

定义了上面的主题之后,接下来就可以在Java代码中使用这个主题了,例如

public class MainActivity extends Activity{
    private ListView listView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.Crazy_theme);
        setContentView(R.layout.activity_main);
    }
}

大部分时候,在AndroidManifest.xml文件中对指定应用、Activity应用主题更加简单。如果我们想让应用的全部窗体使用该主题,只要为<application.../>元素添加android:theme属性,属性值是一个主题的名字,如下代码所示:

<application android:theme="@style/CrazyitTheme">
...
</application>

如果你指向让程序中的某个activity拥有这个主题,那么你可以修改为<activity.../>元素,同样android:theme指定主题即可。

本应用在AndroidManifest.xml文件的<application../>元素中添加了android:theme="@style/CrazyTheme"属性。

Android中提供了几种内置的主题资源,这些主题通过查询Android.R.style类可以看到。

与样式类似的是,Android主题同样支持继承。如果开发过程中还想利用某个主题,但需要对他进行局部修改,则可通过继承系统主题来实现自定义主题。例如如下代码片段:

<style name="CrazyTheme" parent="@android:style/Theme.Dialog">
...
</style>

上面定义的CrazyTheme主题继承了android.R.style.Theme.Dialog主题,那么接下来在该<style.../>元素中添加的<item.../>子元素可覆盖系统主题的部分属性了

android-样式(style)和主题(theme)

标签:

原文地址:http://my.oschina.net/ccqy66/blog/486441

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!