在自定义 View 时,我们经常使用 AttributeSet 自定义一些布局参数。那 defStyleAttr 是如何使用的呢?
View 的全参构造函数:
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
解释说明:
Context context 是一个 View 的 Context,一般并不需要注意,但 View 是通过这个 Context 获取主题 Theme, Resources 等资源的。可能涉及字体加载,语言问题,因此一定要注意当前的 Context。
AttributeSet attrs 是一个布局的属性,在xml布局中的属性都将在这个对象中。
int defStyleAttr 是当前主题中的一个属性,它包含对样式资源的引用,该样式资源为 View 提供默认值。
int defStyleRes 是样式资源的资源标识符,它为 View 提供默认值,仅在 defStyleAttr = 0 或在主题中找不到时使用。
TypedArray 是如何获取的:
final TypedArray a = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
Context obtainStyledAttributes 方法:
public final TypedArray obtainStyledAttributes(@Nullable AttributeSet set, @NonNull @StyleableRes int[] attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) {
return getTheme().obtainStyledAttributes( set, attrs, defStyleAttr, defStyleRes);
}
以下为了更好的解释,以自定义 View 中自定义了一个属性 itemHeight 举例:
如何获取TypedArray
1、首先通过 context 获得当前的主题 Theme
2、如果 defStyleAttr != 0,找到主题 Theme 中 defStyleAttr 的引用
3、查找该引用中是否有 itemHeight 参数
4、如果 defStyleAttr = 0 而且 defStyleRes != 0 ,找到 defStyleRes 中的 itemHeight 参数
如果使用 defStyleAttr 呢?
步骤一,定义一个 attr
<attr name="CustomViewStyle" format="reference" />
步骤二,在自定义 View 中使用这个引用
CustomViewStyle(Context context, AttributeSet attrs, R.attr.CustomViewStyle)
步骤三,在Theme的Style中增加这个引用
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
...
<item name="CustomViewStyle">@style/DefaultCustomViewStyle</item>
</style>
步骤四,写一个DefaultCustomViewStyle
<style name="DefaultCustomViewStyle">
<item name="itemHeight ">50dp</item>
</style>
网友评论