在选择器 StateListDrawable 中使用 attr 引用
Use of attr reference in selector StateListDrawable
我试图在 StateListDrawable
的 XML 定义中引用 ?attr/selectableItemBackgroundBorderless
以更改某些状态的行为原文内定义:
<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
一起工作,它似乎在代码方面做同样的事情:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/transparent" />
<item android:drawable="?selectableItemBackgroundBorderless" />
</layer-list>
是否可以在 <selector>
中使用 ?attr/
?
LayerDrawable 可以灵活地使用 ?attr 或可绘制对象误导。如果你使用 ?attr,它会尝试设置自定义主题属性,但如果你使用常规资源,它会尝试加载一个完全可绘制。引用 LayerDrawable 文档:
May be a reference to another resource, in the form "@[+][package:]type/name" or a theme attribute in the form "?[package:]type/name".
StateListDrawables 仅 期望可绘制对象是这样的引用:
@[package:]drawable/filename
注意 ?attr 或类型是如何被省略的。
参考:https://developer.android.com/guide/topics/resources/drawable-resource
无法解析选择器中的任何引用。这就是为什么我们结束了所有文件的复制(我们在颜色和主题方面遇到了同样的问题)。
您可能想看看那些封闭的问题:
- Use attributes in selector - Android
只需定义两个选择器:例如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>
我试图在 StateListDrawable
的 XML 定义中引用 ?attr/selectableItemBackgroundBorderless
以更改某些状态的行为原文内定义:
<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
一起工作,它似乎在代码方面做同样的事情:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/transparent" />
<item android:drawable="?selectableItemBackgroundBorderless" />
</layer-list>
是否可以在 <selector>
中使用 ?attr/
?
LayerDrawable 可以灵活地使用 ?attr 或可绘制对象误导。如果你使用 ?attr,它会尝试设置自定义主题属性,但如果你使用常规资源,它会尝试加载一个完全可绘制。引用 LayerDrawable 文档:
May be a reference to another resource, in the form "@[+][package:]type/name" or a theme attribute in the form "?[package:]type/name".
StateListDrawables 仅 期望可绘制对象是这样的引用:
@[package:]drawable/filename
注意 ?attr 或类型是如何被省略的。
参考:https://developer.android.com/guide/topics/resources/drawable-resource
无法解析选择器中的任何引用。这就是为什么我们结束了所有文件的复制(我们在颜色和主题方面遇到了同样的问题)。
您可能想看看那些封闭的问题:
- Use attributes in selector - Android
只需定义两个选择器:例如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>