首先打开项目的布局文件
可以看到里面定义了许多的style,每个style有自己的名字,并且会有父style,不难想象,子style会继承父style的所有的item ,那么重点来了!这里的这么多的item到底是什么鬼??数量如此之多,而且很陌生。其实这里所有的name里面的属性都是安卓定义好的,如下图所示:这里面的属性是不是很熟悉??gravity和layout_gravity都是平时经常用的。
我刚刚提到,这些属性名字,包括我们平时画布局是的各种属性名如
<TextView
android:text="aaa"
/>
这里的android:text是怎么来的呢?用了这个属性他怎么就显示出字了呢?
如果能想到这一步!恭喜你,你已经一名合格的程序猿了,说句题外话,我认为每一个程序猿都应该争当一个土拨鼠,只有不停地挖才能不停地发现真相,不可以只是拿来主义,所谓知其然而不知其所以然!只有知道了原理才能胸有成竹地解决bug,并且我认为,这个就是大神与码农的区别。
回到刚刚的问题,这个text属性是哪来的呢?这里就要提到attrs.xml这个文件,首先告诉大家,attrs.xml分为两种,一种是安卓系统预定义好的,以gravity属性为例;
找到系统attrs.xml
发现了没?这些我们平时用的很嗨的属性全部都可以在这个文件里找到,<flag>标签是每个属性对应的可用值.
那么新问题来了,不同的控件有不同的属性,比如<RelativeLayout>和<LinearLayout>就有很多属性是不一样的,那么控件与属性的关系是怎么建立的呢?
以TextView为例
找到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 等高级属性。