UI进阶——Style的详细介绍

本文详细介绍了Android中Style的概念、作用、组成和工作原理,包括style在Application、Activity和View上的应用,以及如何创建和使用style。通过示例展示了style如何设置默认属性、自定义item,并探讨了style的命名和作用范围。此外,还讨论了如何在代码中应用自定义的item以实现界面风格的动态切换,以适应不同场景的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

楔子

在android UI的开发中,合理的利用style资源是必不可少的一件事。但是个人翻阅很多文章,很少有详细的描述style的原理及其具体的使用。所以决定写一篇详细描述style的文章。

style的简单描述

style的作用

当创建App之后,我想大家肯定都有这样的疑惑,为什么刚创建的Activity的背景是白色的,使用TextView显示出的字的颜色都是黑色的?这种一开始就默认的属性是由什么控制的呢?这个就是style资源的作用了

style指定了你的界面上的属性默认情况下通过什么样的方法进行装饰。
属性指的是:颜色、高度、填充和字体大小等。
比如说:界面的背景默认采用哪种颜色,界面的文字默认采用哪种颜色等等。

style的作用范围

好了现在我们知道了style是用来设置界面的默认属性的。那么style可以设置在哪些对象上呢?

Style可以设置在三个对象上,分别是Application、Activity、View(布局和控件的总称)

根据应用的对象不同,style的称呼作用也是不一样的:

  1. 被称作”theme”的style是Application和Activity中使用(是针对窗体级别的,可以改变窗体样式)

  2. 被称作”style”的style是在View(指Layout与View控件)上使用的(是针对窗体元素级别的,改变指定控件或者Layout的样式)

疑问一:为什么Google大费周章的让style可应用与三个对象呢?

相信大部分兄弟已经猜到了,这是因为style应用在不同的对象上,其可作用范围也就不同。

可作用范围图(包含关系):

这里写图片描述

为什么叫做可作用范围呢?意思是当style作用于Application时,Application内部的元素可以选择使用该style中设定的默认值,也可以选择不使用该style中设定的默认值。
比如说,Application的style背景色设置为灰色。那么所有Activity下的Layout选择使用该style的背景色,所以Layout的背景是灰色的。但是其中Button不使用该style设定的默认背景。

效果图

这里写图片描述

所以证明了,style资源其实只是一种声明,真正是否使用是在代码中确定的。为什么我们可以直接使用style,而不需要在代码中声明?这是因为Goole自定义了一堆style资源的声明,并在原生控件的代码中确定使用了style资源的声明而已。

如何确定哪些控件使用了style的默认值,哪些控件没使用呢?
这个就得靠经验的积累了(最典型的比如,Button的背景色不根据style来设置的,而TextView的背景色根据style来设置的)

那么代码是如何获取style资源的呢,并且如何在代码中确定是否使用该声明呢?
由于该涉及到自定义View的内容,就不描述了,详细内容可以参考鸿洋:深入理解Android中的自定义属性

我们回到作用范围上,那么如果将style运用在FirstActivity上,意思就是该Activity内部的元素可以选择使用该style中设定的默认值。用style设置默认背景色为天蓝色。

效果图

这里写图片描述

从图中我们可以看到,只有FirstActivity的背景色变成天蓝色了,其他Activity的背景色还是灰色的。(这个就是作用范围,说明Activity的style的作用范围,只在当前Activity内部)并且在FirstActivity中TextView的背景色也变成天蓝色了,但是Button的背景色还是灰色的。(这个就是可选择,说明不是所有控件的背景色都是由style控制的)
这个就是Style的可选择范围的意思

同样的作用范围越大,责任就越重~~。被称为theme的style,必须得考虑到应用中所有可能运用到的默认值,并设置相关的默认属性值。所以都会采用Android自带的theme。自动为我们设定了必要的默认值。

疑问二:那么style作用不同,又是什么意思呢?

style的作用难道不是设置默认属性吗,还有什么其他作用吗?这里作用指的是style默认值设置的数量,就跟刚才说的作用范围越大,责任就越重,必须得考虑到应用中所有可能运用到的默认值。举个不恰当的例子。我们将Application当做一个房子,Activity当做一个房间,那么View就是房间的部件。那么我们开始用style来设计房子。首先我们先粉刷View,View是一把椅子,我想要一把棕色的靠背椅,那么就将style的背景变成棕色,将形状设置成靠背椅。这个style就完成了。好了我现在将这个style应用在房子上,发现整个房子只有靠背椅被设计出来了,房子内其他的东西都没有被设计出来(比如墙啊,天花板啊,房间的颜色,大小,位置等)。由于房子和房间的设计太多了太复杂了,就被称为theme。像对View这种简单,少的设计称为style。为了减少开发者的复杂度,Android就自己设计了几款房子的样式供我们使用。

style的组成及工作原理

基本组成

当我们创建一个项目的时候,会在res/values/路径下,默认生成style.xml这样的文件。并且提供了这样的默认样式。

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

这些都是什么意思呢,作用是什么呢?

第一:< style > < / style>
创建style,就必须写在style.xml这个文件中。
并通过< style > < / style >标签来表示,创建了一个style

第二:< style >标签的属性

name:表示当前style的名字,调用方通过名字选择具体的style。

parent:表示该style继承了哪一个< style >。(说明style采用的是继承制,继承是继承父类的子标签,也就是< item >。)只有继承Android自带的theme的style,才能被称为theme。

第三:< style >的子标签< item >
表示默认值的名字,及其值。一个样式中,会存在各种各样的默认值设置。(比如说,宽度,高度,字体大小,字体颜色等)这些每个的默认值,都由一个item表示。
name:默认值的名字,当然这些name可不是随便设置的

第一种方式:android已经为我们自定义了一堆item了
比如平时经常在layout中针对View使用到的

    android:layout_width="xx"
    android:layout_height="xx"
    android:background="xx"
    ...

其实是item的一部分,也可以在< style >中使用,这些属性主要是针对View的设置。其他一部分,比如说针对Activity的ActionBar的样式修改
就只能在< style >中使用了。

第二种方式:自定义item (这个先放一放,在创建Style技巧的时候进行说明)

工作原理

首先,android本身自带了一堆style,和定义的item。这些style被称作为theme。也就是说都是被Application和Activity使用的。
(关于style的种类,及其< item >属性太多了,只能自己翻阅相关文档了 = =)

其次,当然android自带的theme可能有些item设置的默认属性不符合我们的要求,我们想要去修改它,那么如何修改这些item呢?

从组成中我们知道,style采用的是继承制(原理跟java的继承是一样的就不多说了),通过< style >的parent的属性继承其他style。与java同样我们只需要对想修改的部分进行重写就可以了。在java中是子类与父类的方法名相同,在style中是子style中< item >的 name属性与父style中< item > 的 name属性相同。
例:

    <!--继承父类   parent="Theme.AppCompat.Light.DarkActionBar"-->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!--重写background-->
        <item name="android:background">#343434</item>
    </style>

这样一个符合自己风格的默认样式就诞生了。

最后,就是控件获取该样式,并进行判断是否使用该样式中的默认值。

style的使用及优点

说了这么多理论,大家现在肯定是云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值