自定义视图从Android中的自定义主题属性获取自定义属性值

问题描述

问题是这个。 我有一个名为CustomedView自定义视图,并定义了一个名为myTintColor自定义视图属性,因此我可以在XML中使用我的自定义视图,并用自定义属性myTintColor定义其属性。 >

这样的代码

<CustomedView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:myTintColor="@color/color1"
/>

// in kotlin or java code
val a = context.obtainStyledAttributes(attrs,R.styleable.CustomedView)
val colorResId = a.getResourceId(R.styleable.CustomedView_myTintColor,0)
val myTintColor = context.getColor(colorResId)
a.recycle()

任何人都可以理解以上内容,并且效果很好。现在,如果我定义这样的主题属性

<resources>
    <attr name="myBackgroundColor" format="color" />
</resources>

,然后使用此属性指示自定义视图的myTintColor

<CustomedView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:myTintColor="?attr/myBackgroundColor"
/>

那么,现在的问题是,如何从自定义属性获取颜色?

我的代码是:

val a = context.obtainStyledAttributes(attrs,R.styleable.CustomedView)
val attrId = a.getResourceId(R.styleable.CustomedView_myTintColor,0)
val typedValue = TypedValue()
context.theme.resolveAttribute(attrId,typedValue,true)
val myTintColor = typedValue.data // but this value is always 0.
a.recycle()

解决方法

您的自定义属性 myBackgroundColor 仍然引用颜色。

val color = a.getColor(R.styleable.CustomedView_myBackgroundColor,resources.getColor(R.color.defaultColor))
textView.setTextColor(color)