1

我试图?attr/selectableItemBackgroundBorderless在 a 的XML定义中引用StateListDrawable以更改原始中定义的某些状态的行为:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/transparent" android:state_pressed="false" />
    <item android:drawable="?selectableItemBackgroundBorderless" />
</selector>

但这会导致崩溃:

Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 0: TypedValue{t=0x2/d=0x7f040298 a=-1}
  at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:946)
  at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
  at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:177)
  at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:122)
  at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
  at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332)
  at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291)
  at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:833)
    ... 46 more

我不明白的是,为什么它实际上可以与LayerDrawable似乎在代码方面做同样事情的 a 一起工作:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/transparent" />
    <item android:drawable="?selectableItemBackgroundBorderless" />
</layer-list>

是否可以在 a 中使用?attr/a <selector>

4

3 回答 3

2

无法解析选择器中的任何引用。这就是我们结束复制所有文件的原因(我们在颜色和主题方面遇到了同样的问题)。

你可能想看看那些封闭的问题:

  1. https://stackoverflow.com/a/30757188​​/4310905
  2. 在选择器中使用属性 - Android
于 2019-06-20T14:53:58.450 回答
0

LayerDrawable使用?attr或 drawable 的灵活性可能会产生误导。如果您使用?attr,它将尝试设置自定义主题属性,但如果您使用常规资源,它将尝试完全加载可绘制对象。引用 LayerDrawable 文档:

可能是对另一个资源的引用,格式为“@[+][package:]type/name”或格式为“?[package:]type/name”的主题属性。

StateListDrawables期望可绘制对象是这样的引用:

@[package:]drawable/filename

注意?attr或 type 是如何被省略的。

参考:https ://developer.android.com/guide/topics/resources/drawable-resource

于 2019-06-17T08:03:37.900 回答
0

只需定义两个选择器:例如 selector_1.xml 和 selector_2.xml 并在您的 styles.xml 中使用它们:

<style ...>
<item name="themeChannelBackground">@drawable/selector_1</item>
</style>

<style ...>
<item name="themeChannelBackground">@drawable/selector_2</item>
</style>
于 2020-06-15T07:48:56.897 回答