在选择器StateListDrawable中使用attr引用

时间:2019-06-09 20:43:53

标签: android android-xml android-drawable android-selector android-attributes

我试图在?attr/selectableItemBackgroundBorderless 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一起工作,而<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@android:color/transparent" /> <item android:drawable="?selectableItemBackgroundBorderless" /> </layer-list> 似乎在执行相同的代码方式:

?attr/

是否可以在<selector>中使用Calendar cal = new GregorianCalendar(); int startDay = cal.get(Calendar.DAY_OF_YEAR) % 7 + 1; System.out.println(startDay);

3 个答案:

答案 0 :(得分:1)

无法解析选择器中的任何引用。这就是为什么我们结束了所有文件的重复操作(我们在颜色和主题设置方面存在相同的问题)。

您可能想看看这些封闭的问题:

  1. https://stackoverflow.com/a/30757188/4310905
  2. Use attributes in selector - Android

答案 1 :(得分:0)

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

  

可以以“ @ [+] [package:] type / name”的形式引用另一个资源,或者以“?[package:] type / name”的形式的主题属性。

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

@[package:]drawable/filename

请注意,如何省略 ?attr 或类型。

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

答案 2 :(得分:0)

只需定义两个选择器:选择器_1.xml和选择器_2.xml 并在您的styles.xml中使用它们:

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

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