安卓style.xml与attrs.xml的深入解析

时间:2024-03-22 18:38:40

首先打开项目的布局文件

安卓style.xml与attrs.xml的深入解析
接着,打开styles.xml,我截取了一段,如图所示:
安卓style.xml与attrs.xml的深入解析

         可以看到里面定义了许多的style,每个style有自己的名字,并且会有父style,不难想象,子style会继承父style的所有的item ,那么重点来了!这里的这么多的item到底是什么鬼??数量如此之多,而且很陌生。其实这里所有的name里面的属性都是安卓定义好的,如下图所示:这里面的属性是不是很熟悉??gravity和layout_gravity都是平时经常用的。

安卓style.xml与attrs.xml的深入解析


我刚刚提到,这些属性名字,包括我们平时画布局是的各种属性名如

<TextView

android:text="aaa"

/>

这里的android:text是怎么来的呢?用了这个属性他怎么就显示出字了呢?

如果能想到这一步!恭喜你,你已经一名合格的程序猿了,说句题外话,我认为每一个程序猿都应该争当一个土拨鼠,只有不停地挖才能不停地发现真相,不可以只是拿来主义,所谓知其然而不知其所以然!只有知道了原理才能胸有成竹地解决bug,并且我认为,这个就是大神与码农的区别。

        回到刚刚的问题,这个text属性是哪来的呢?这里就要提到attrs.xml这个文件,首先告诉大家,attrs.xml分为两种,一种是安卓系统预定义好的,以gravity属性为例;

找到系统attrs.xml

安卓style.xml与attrs.xml的深入解析

安卓style.xml与attrs.xml的深入解析


发现了没?这些我们平时用的很嗨的属性全部都可以在这个文件里找到,<flag>标签是每个属性对应的可用值.

那么新问题来了,不同的控件有不同的属性,比如<RelativeLayout>和<LinearLayout>就有很多属性是不一样的,那么控件与属性的关系是怎么建立的呢?

以TextView为例

安卓style.xml与attrs.xml的深入解析


找到TextView的构造方法,凡是自定义过View的都知道,构造方法里经常提示我们需不需要加个

AttributeSet attrs属性

public TextView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

这个属性就是本控件需要绑定的属性集合.


到这里我们就知道了,自定义控件时如果自己给我们的控件加上一些自己的属性,在attrs.xml中创建一个<declare-styleable>标签,name是名字,

<declare-styleable name="StarRatingView">
    <!--星星点亮-->
    <attr name="stat_on" format="reference"></attr>
    <!--星星关闭-->
    <attr name="stat_off" format="reference"></attr>
    <!--半颗星星-->
    <attr name="stat_half" format="reference"></attr>
    <!--是否可以点击滑动评分-->
    <attr name="ratable" format="boolean"></attr>
    <!--星星之间间距-->
    <attr name="star_padding" format="dimension"></attr>
</declare-styleable>
然后在自定义的控件的构造方法里引用这边的name,

另外在使用这些自定义控件的自定义属性的时候还有几点需要注意

因为以android:开头的属性都是安卓自定义的属性,如果要用自己的自定义属性,首先要申明如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
              android:background="#171A24"
              android:orientation="horizontal"
              android:layout_width="match_parent"
              android:layout_height="100dp"
              xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:star="http://schemas.android.com/apk/res-auto"
              xmlns:app="http://schemas.android.com/apk/res-auto">

正是因为这里声明了smlns:android = "http://schemas.android.com/apk/res/android"所以我们才可以以安卓开头开调用属性,相同的我们调用自己的属性也是一样

<com.app.OneRiceStar.ui.view.StarRatingView
    android:id="@+id/milife_star"
    android:layout_width="match_parent"
    android:layout_height="15dp"
    android:layout_marginTop="5dp"
    android:gravity="center"
    app:stat_off="@mipmap/msh_star_kong"
    star:ratable="false"
    star:stat_half="@mipmap/msh_star_half"
    star:stat_on="@mipmap/msh_star_sx"
    >

最后总结:style.xml是定义全局属性给所有的控件都可以使用,提高效率,里面的item属性还是来源于attrs.xml,只有在attrs.xml中定义好了的属性,styles.xml里面才可以调用。styles.xml 可以单独被一个 View 使用,也可以给Activity使用或者作为 Application 风格(前者在 layout中使用 android:style=”XXXX” 后者在 manifest 文件的 application 节点下 使用 android:theme=”XXXX” )。

其实总的来说, style 就是一组属性集合,例如 width ,padding,color,height,等,更复杂一点的包括 windowNoTitle,windowBackground,windowContentOverlay 等高级属性。