layer-list drawable 自动转换为 BitmapDrawable

Posted

技术标签:

【中文标题】layer-list drawable 自动转换为 BitmapDrawable【英文标题】:layer-list drawable gets automatically converted to BitmapDrawable 【发布时间】:2020-10-29 07:44:14 【问题描述】:

我在 xml 中创建了一个包含 3 个位图可绘制对象的图层列表。当我尝试在 java 代码中检索该可绘制对象时,我收到一个 BitmapDrawable 对象,而不是 LayerDrawable 对象。

这是我的图层列表可绘制 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android: android: android:id="@+id/a">
        <bitmap android:src="@drawable/add_to_list" />
    </item>
    <item android: android: android:id="@+id/b">
        <bitmap android:src="@drawable/refresh" />
    </item>
    <item android: android: android:id="@+id/c">
        <bitmap android:src="@drawable/trash" />
    </item>
</layer-list>

我在“Input_Field styleable xml”中声明了一个名为 iconBar 的属性,它应该包含对上述 LayerDrawable 的引用,这里是“Input_Field styleable xml”:

   <resources>
  <declare-styleable name="InputField">
            <attr name="iconBar" format="reference" />          
        </declare-styleable>
    </resources>

这是视图 InputField 的 xml 代码,它的 iconBar 属性包含对图层列表可绘制 iconbar_drawable 的引用:

<com.example.asuss.calcuroid.CustomViews_ViewGroups.CustomViews.InputField
appx:iconBar="@drawable/iconbar_drawable"/>

我的java代码:

final TypedArray a = getContext().obtainStyledAttributes(
                    attrs, R.styleable.InputField, defStyle, 0); 
if(a.hasValue(R.styleable.InputField_IconsArray))
            
    LayerDrawable iconBar = (LayerDrawable) a.getDrawable(R.styleable.InputField_iconBar);

运行应用程序后,我收到以下运行时异常

java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable cannot be cast to android.graphics.drawable.LayerDrawable

谁能帮我理解这种奇怪的行为?

【问题讨论】:

【参考方案1】:

问题是您试图将styleable 值膨胀为drawable 资源。 R.styleable 中的值不是资源 ID,因此您会得到任何资源,以获取该 ID。

要解决此问题,请将R.styleable.InputField_iconBar 替换为R.drawable.your_xml_filename(并确保您已导入your.package.name.R 而不是android.R)。

【讨论】:

谢谢 Ryan M。很抱歉,我忘了提及 a.getDrawable(R.styleable.InputField_iconBar) 中的“a”是一个 TypedArray 对象。我编辑了问题

以上是关于layer-list drawable 自动转换为 BitmapDrawable的主要内容,如果未能解决你的问题,请参考以下文章

layer-list:Android中layer-list使用详解

关于shape和selector和layer-list的drawable详细说明

Android Drawable - layer-list

Android Drawable - layer-list

系统的Drawable-LayerListDrawable

Android:res之layer-list的用法