This answer有所帮助,但并未完全涵盖我的问题。
以下是我的XML:
<android.support.v7.widget.CardView
... other attributes...
android:foreground="?android:attr/selectableItemBackground"
>
问题是我希望能够在代码中解析该attr。以下是我到目前为止的情况:
val typedValue = TypedValue()
context.theme.resolveAttribute(R.attr.selectableItemBackground, typedValue, true)
typedValue.string // "res/drawable/item_background_material.xml"
typedValue.type // 3 (string)
typedValue.data // 656
我想可以使用链接的答案来直接解析R.drawable.item_background_material
,但使用?android:attr/...
的全部意义在于我知道那里的attr点。如何利用TypedValue
对象中包含的信息来解析可绘制引用?
顺便说一下,我试过了
val drawableRes = string.substring(string.lastIndexOf("/") + 1, string.indexOf(".xml")) // gross, but it's just a proof of concept
val drawable = resources.getIdentifier(drawableRes, "drawable", context.packageName)
但结果始终是0
。
答案 0 :(得分:1)
该资源标识符将位于resourceId
field中。也就是说,在您的示例中,typedValue.resourceId
。
对于任何使用Kotlin的人来说,这是一个非常简洁的方法来实现它:
foreground = with(TypedValue()) {
context.theme.resolveAttribute(R.attr.selectableItemBackground, this, true)
ContextCompat.getDrawable(context, resourceId)
}