基础转载大佬博客:
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
所指定的值。优先级依次为第一个参数、第三个参数、第四个参数所代表的资源。
网友评论