在代码中解析“?android:attr / selectableItemBackground”的值

时间:2018-04-09 19:16:16

标签: android android-custom-view

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

1 个答案:

答案 0 :(得分:1)

该资源标识符将位于resourceId field中。也就是说,在您的示例中,typedValue.resourceId

对于任何使用Kotlin的人来说,这是一个非常简洁的方法来实现它:

foreground = with(TypedValue()) {
    context.theme.resolveAttribute(R.attr.selectableItemBackground, this, true)
    ContextCompat.getDrawable(context, resourceId)
}