android 自定义控件细节

2018-10-15  本文已影响0人  codeflame

基础转载大佬博客:
Android 从0开始自定义控件之 自定义 View 基础实例(十)
Android 从0开始自定义控件之 自定义属性详解(十一)


obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)

defStyleAttr:An attribute in the current theme that contains a reference to a style resource that supplies defaults values for the TypedArray. Can be 0 to not look for defaults.
查找当前主题的属性值(引用类型),提供给TypedArray(返回的结果),设置为0时则不去查找。

比如属性的定义(取自大佬博客):

<declare-styleable name="CustomAttribute">
    <attr name="custom_type" format="string"/>
    <attr name="customStyle" format="reference"/>
</declare-styleable>

主题的中设置的属性值:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="customStyle">@style/DefaultCustomStyle</item>
</style>

<style name="DefaultCustomStyle">
    <item name="custom_type">2:主题中声明的默认样式属性</item>
</style>

在这里,defStyleAttr的值只能为R.attr.customStyle。分析如下:
1.<attr>标签在不在<declare-styleable>(它只是一个分组罢了)里面都没关系,实际都是全局范围内的属性,都能够从R.attr.XXX中访问

2.customStyle的值是一个引用,由上面代码format="reference"这段定义的

3.R.attr.customStyle满足官方说明的几个要求:
(1)当前主题中设置了该属性
(2)该属性的值是引用类型
(3)该引用类型是对一个style的引用(即@style/DefaultCustomStyle)
所以,R.attr.customStyle可以作为参数。
最终结果:DefaultCustomStyle中的custom_type属性将被获取,给到TypedArray

其他的R.attr.custom_type、R.styleable.XXX这些都不符合要求。



defStyleRes:A resource identifier of a style resource that supplies default values for the TypedArray, used only if defStyleAttr is 0 or can not be found in the theme. Can be 0 to not look for defaults.

类似上面,只不过这里要求细节没那么多。给定一个R.style.XXX就可以了,该样式里面的属性都可以被获取。

注:上面说的属性值的获取,都只会获取int[] attrs所指定的值。优先级依次为第一个参数、第三个参数、第四个参数所代表的资源。

上一篇下一篇

猜你喜欢

热点阅读