возможность рисования списка слоев автоматически преобразуется в BitmapDrawable

Я создал список слоев, состоящий из 3 растровых рисунков в формате xml. Когда я пытаюсь получить этот объект в коде Java, я получаю объект BitmapDrawable, а не объект LayerDrawable.

Вот мой XML-код для рисования списка слоев:

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

Я объявил атрибут с именем iconBar внутри стилизованного XML-файла Input_Field, который должен содержать ссылку на вышеупомянутый LayerDrawable, и вот стилизованный XML-код Input_Field:

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

Вот код xml представления InputField, у которого есть атрибут 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

Может ли кто-нибудь помочь мне понять это странное поведение?


person Mina Nazmy Moneer    schedule 08.07.2020    source источник


Ответы (1)


Проблема в том, что вы пытаетесь раздуть значение styleable как ресурс drawable. Значения в R.styleable не являются идентификаторами ресурсов, поэтому вы получаете любой ресурс, получивший этот идентификатор.

Чтобы это исправить, замените R.styleable.InputField_iconBar на R.drawable.your_xml_filename (и убедитесь, что вы импортировали your.package.name.R, а не android.R).

person Ryan M    schedule 09.07.2020
comment
Спасибо, Райан М. Извините, я забыл упомянуть, что a в a.getDrawable(R.styleable.InputField_iconBar) является объектом TypedArray. я отредактировал вопрос - person Mina Nazmy Moneer; 09.07.2020