Использование доступных ресурсов

У меня такая проблема, см. Стек трассировки:

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, все в порядке.

Могу ли я использовать ресурс с возможностью рисования в качестве источника для растрового изображения? На всякий случай вот мой файл 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>

person Alexander Gubarets    schedule 20.03.2012    source источник
comment
Спасибо. но хм. что я должен делать? мне нужно разместить один ресурс xml с возможностью рисования над другим, но мой ресурс масштабируется ... что я должен сделать, чтобы избежать масштабирования ресурса с возможностью рисования xml? и ‹item› не имеют параметра силы тяжести ...   -  person Alexander Gubarets    schedule 20.03.2012
comment
Я получаю эту ошибку (<bitmap> requires a valid src attribute), когда использую векторное изображение для растрового изображения. Мое решение - используйте ответ @Santiago Rivas - или используйте другое изображение (не векторное изображение)   -  person Linh    schedule 15.08.2018


Ответы (4)


У вас не может быть рисованный XML в качестве источника для растрового изображения. Потому что, например, если бы это было возможно, он мог бы по ошибке создать черную дыру, вызвав xml самому себе.

Предположим, у вас есть XML-файл A с возможностью рисования, в котором есть растровое изображение, источник которого можно рисовать B. Но в выводимом B, у него есть растровое изображение, источник которого можно рисовать A. Это создаст круговой цикл, который не может быть разрешен. Вот почему вам необходимо предоставить изображение в качестве источника для растрового изображения, чтобы избежать путаницы.

person waqaslam    schedule 20.03.2012
comment
Спасибо за этот Waqas, у меня точно такой же вопрос (но не слился, поскольку он отмечен как ответ), но я прошу решения: stackoverflow.com/questions/10055892 / - person ataulm; 07.04.2012
comment
@waqaslam, ваш ответ правильный: вы не можете использовать XML в качестве источника для тега растрового изображения. Что меня сбивает с толку, так это ваше объяснение: циклическая ссылка может встречаться в любом контексте при обращении к ресурсам XML. Мне кажется, это ограничение дизайна в фреймворке. - person Jose_GD; 05.03.2014
comment
Вторая часть просто неактуальна - person Farid; 15.02.2021

Чтобы избежать ошибки: строка двоичного XML-файла #XXX: требуется действительный атрибут src

внутри списка слоев используйте:

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

вместо того:

<item>
  <bitmap android:src="@drawable/image"/>
</item>
person Santiago Rivas    schedule 27.06.2014
comment
а что, если мне нужен tileMode? - person Gudin; 17.02.2016
comment
Да, что, если мне нужен tileMode, оттенок или любой из многих других атрибутов растрового изображения ...? - person Greg Ennis; 30.03.2016
comment
Для меня это реальное решение !! - person Akash Bisariya; 23.11.2017
comment
Это показывает мой чертеж, но он всегда показывает его в полноэкранном режиме, а не в нормальном размере в API 28. - person Heath Borders; 24.07.2019
comment
Это решение не объясняет разницу между ними и не работает в новых версиях api. - person desgraci; 25.10.2019

Минимальный SDK: API 23

вытяжка / 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

Источник

person Braian Coronel    schedule 01.08.2019
comment
Обратите внимание, что ширину и высоту вы можете использовать, только если min больше 23. - person Skizo-ozᴉʞS; 27.04.2020
comment
@ Skizo-ozᴉʞS Обновленный ответ. Спасибо - person Braian Coronel; 27.04.2020

Если вы хотите использовать селектор для изменения атрибута оттенка, создайте селектор только для цвета.

<?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" />
person aphanite    schedule 08.09.2020