список слоев автоматически преобразуется в BitmapDrawable - PullRequest
1 голос
/ 08 июля 2020

Я создал список слоев из трех растровых изображений в 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 внутри «Input_Field styleable xml», который должен содержать ссылку на вышеупомянутый LayerDrawable, а вот «Input_Field styleable xml»:

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

My java code:

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 Ответ

1 голос
/ 09 июля 2020

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

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

...