美文网首页
【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