美文网首页
【Android】自定义 View 中 defStyleAttr

【Android】自定义 View 中 defStyleAttr

作者: 果果_Zhen | 来源:发表于2021-02-11 12:13 被阅读0次

在自定义 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>

相关文章

网友评论

      本文标题:【Android】自定义 View 中 defStyleAttr

      本文链接:https://www.haomeiwen.com/subject/pfekxltx.html