【问题标题】:Using drawable resources使用可绘制资源
【发布时间】:2012-04-05 00:48:30
【问题描述】:

我有这个问题,查看跟踪堆栈:

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 是可绘制资源中的另一个 xml 文件 当我使用图像(* .png)而不是 xml 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 可绘制资源?并且没有重力参数...
  • 当我使用 vector image 作为位图时,我收到了这个错误 (&lt;bitmap&gt; requires a valid src attribute)。我的解决方案是 - 使用 @Santiago Rivas 答案 - 或者使用另一个图像(不是矢量图像)

标签: android bitmap drawable xml-drawable


【解决方案1】:

为避免错误:二进制 XML 文件行 #XXX:需要有效的 src 属性

在层列表中,使用:

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

代替:

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

【讨论】:

  • 但是如果我需要 tileMode 怎么办?
  • 是的,如果我需要 tileMode、tint 或位图上的任何其他许多属性...?
  • 这对我来说是真正的解决方案!
  • 这显示了我的drawable,但它总是显示全屏大小而不是API 28上的正常大小。
  • 这个解决方案没有解释它们之间的区别,并且在新的 api 版本上会中断
【解决方案2】:

你不能有一个 xml drawable 作为位图的来源。因为例如如果可能的话,它可能会错误地通过调用自己的 xml 来创建一个黑洞。

假设,您有一个 xml 可绘制 A,其中有一个位图,其来源是可绘制 B。但是在drawableB中,它有一个位图,其来源是drawableA。这将创建一个无法解决的循环。这就是为什么您需要提供图像作为位图的来源以避免任何混淆

【讨论】:

  • 感谢这个 Waqas,我有完全相同的问题(但没有合并,因为这被标记为已回答) - 但我正在寻求解决方案:stackoverflow.com/questions/10055892/…
  • @waqaslam,您的答案是正确的:您不能将 XML 可绘制对象作为位图标记的来源。我觉得令人困惑的是您的解释:在引用 XML 资源时,循环引用可以在任何上下文中发生。在我看来,这是框架中的设计约束
  • 第二部分无关紧要
【解决方案3】:

最低 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>

注意:截至今天,API 23 的累积分布为 84.9%。因此,您可能会考虑使用较低 API 的替代方案

GL

Source

【讨论】:

  • 请注意,宽度和高度只有在 min 大于 23 时才能使用
  • @Skizo-ozᴉʞS 更新回复。谢谢
【解决方案4】:

如果你想使用选择器来改变色调属性,只为颜色创建选择器。

<?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" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2017-12-05
    相关资源
    最近更新 更多