【问题标题】:Use of attr reference in selector StateListDrawable在选择器 StateListDrawable 中使用 attr 引用
【发布时间】:2019-06-09 20:43:53
【问题描述】:

我正在尝试在 StateListDrawableXML 定义中引用 ?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>

是否可以在&lt;selector&gt; 中使用?attr/

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      @[package:]drawable/filename
      

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-02
          • 1970-01-01
          相关资源
          最近更新 更多