一、Attr
属性,风格样式的最小单元;
Attr 的定义
在自定义 View 的时候,在 res/attrs.xml 文件中声明属性,而Android 系统的属性也是以同样的方式定义的。
比如 layout_width 属性对应到框架中的 attr 如下:
<declare-styleable name="ViewGroup_Layout">
<attr name="layout_width" format="dimension"> <enum name="fill_parent" value="-1" /> <enum name="match_parent" value="-1" /> <enum name="wrap_content" value="-2" /> </attr> ... </declare-styleable>
attr 的 format 有以下几种格式,可以进行或运算:
color、reference、boolean、dimension、enum、flag、float、fraction、integer、string
这里着重说一下 enum 是枚举值,而 flag 可以进行或运算,属性值可以叠加使用,
reference 用在一些可以设置引用值的情况,引用 res 资源
fraction 是百分数的意思
二、Style
风格,它是一系列Attr的集合,用以定义一个View的样式;
style 是定义在 res/styles.xml 文件中的,在控件中使用时只需要style="@style/style_name"
就可以使用样式了。
我们在自定义 View 时通过
·obtainStyledAttributes( AttributeSet set, @StyleableRes int[] attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)
方法获取自定义的 attr ,其中第一个参数表示是 xml 文件解析后得到的属性集合,attrs 是 View 声明的属性集,后两个用作指定默认的 Style,表示如果 set 中没有你想获得的属性,但如果你指定了默认 Style,它会去从该默认的 Style 里面找你想要的属性。defStyleAttr 和 defStyleRes 功能一样,指定的资源形式不同,前者表示一个默认的指向一个 style 风格的 attr 属性,而后者你可以直接传入一个 style 风格的 id。
三、Theme
主题,它与Style作用一样,都是一系列属性的集合,不同于Style作用于一个单独View,而它是作用于Activity上或是整个应用;与 Window 有关的属性作用于 Window,与 View 有关的属性作用于 Activity 的所有 View 或者整个应用的所有 View,如果想要改变 Window 的属性,那么继承相应 Theme,重写属性值,如果想要改变 View 相关样式,在 Theme 中重写属性作用于整个 Activity 或整个应用,或者定义 style 作用于单个 View。
Theme 的实质也是 Style,Theme 的定义格式与 Style 的基本一致,Theme 需要设置到 AndroidManifest.xml 的 或者 标签下,设置后,被设置的 Activity 或整个应用下所有的 View 都可以使用该