使用可绘制资源

72

我遇到了这个问题,看到了堆栈跟踪:

E/AndroidRuntime(2410): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #5: <bitmap> requires a valid src attribute

我的xml文件如下:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <bitmap android:src="@drawable/btn_1"/>
    </item>
</layer-list>

btn_1是drawable资源中的另一个xml文件。当我使用图像(*.png)代替xml drawable时,它可以正常工作。

我能否将drawable资源用作位图的src?万一这是我的btn_1.xml文件。即使btn_1文件没有任何项,它也不起作用。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/btn_arrow_bg_red"/>
<item>
    <bitmap
        android:gravity="center"
        android:src="@drawable/btn_arrow_white" />
</item>
</layer-list>

谢谢。但是,我该怎么办?我需要将一个可绘制的XML资源放在另一个上面,但我的资源正在缩放...我必须做什么才能避免缩放XML可绘制资源?而且<item>没有重力参数... - Alexander Gubarets
当我使用矢量图像作为位图时,出现了错误(<bitmap>需要一个有效的src属性)。我的解决方案是 - 使用@Santiago Rivas的答案 - 或者使用另一张图片(不是矢量图像)。 - Linh
4个回答

127
为避免错误:二进制 XML 文件第 #XXX 行需要有效的 src 属性。 在图层列表中,请使用以下代码:
<item android:drawable="@drawable/image" />

而不是:

<item>
  <bitmap android:src="@drawable/image"/>
</item>

15
如果我需要瓷砖模式(tileMode),该怎么办? - JoKr
33
如果我需要在位图上使用tileMode、tint或其他许多属性,该怎么办呢? - Greg Ennis
2
这对我来说是真正的解决方案!! - Akash Bisariya
4
这显示了我的可绘制对象,但它总是以全屏大小而不是在API 28上的正常尺寸显示。 - Heath Borders
2
这个解决方案没有解释它们之间的区别,并且在新的API版本上会出现错误。 - desgraci
正常工作! - Henry Letting

59

你不能将XML drawable作为位图的来源。因为如果可能的话,它可能会通过调用 XML 自身而错误地创建黑洞。

假设你有一个 XML drawable A,它有一个位图,其来源是 drawable B。但在 drawable B 中,它有一个位图,其来源是 drawable A。这将创建一个无法解决的循环往复。这就是为什么你需要提供一张图片作为位图的来源以避免任何混淆。


谢谢你的回复,Waqas。我有完全相同的问题(但没有合并,因为这个问题已经被标记为已解决),但我正在寻求解决方案:https://dev59.com/xWkw5IYBdhLWcg3wNX33 - ataulm
24
@waqaslam,你的答案是正确的:你不能将XML drawable作为位图标签的源。我觉得令人困惑的是你的解释:当引用XML资源时,循环引用可以发生在任何上下文中。在我看来,这是框架中的设计限制。 - Jose_GD
第二部分是无关紧要的。 - Farid
为什么这段代码在API 18上可以运行? - Seyyed

15

最低SDK版本: API 23

drawable/yourDrawable.xml

在下面的代码中,我将矢量图作为背景放在第一个位置,并在背景上方放置了一个自定义大小的居中标志。

<layer-list
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/background_in_svg_1">

    </item>
    <item
        android:width="200dp"
        android:height="60dp"
        android:gravity="center_vertical|center_horizontal"
        android:drawable="@drawable/logo_in_svg_2"/>
</layer-list>

注意:截至2023年3月18日,API 23的累积分布为84.9%。因此,您可能需要考虑使用低版本API的替代方案。

祝好

来源


1
请注意,只有在最小值大于23时才能使用宽度和高度。 - Skizo-ozᴉʞS ツ
1
@Skizo-ozᴉʞS 更新了回复。谢谢。 - Braian Coronel

3
如果您想使用选择器来更改色调属性,请创建仅针对颜色的选择器。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/white" android:state_pressed="true" />
    <item android:color="@color/white" android:state_activated="true" />
    <item android:color="@color/green" />
</selector>

然后将其用作 android:tint 中的颜色。

<ImageView
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:tint="@color/tint_menu_item"
    android:src="@drawable/ic_menu_home" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接