Подтвердить что ты не робот

Получить идентификатор ресурса для ссылочной ссылки, используемой в атрибуте стиля

Имея это пользовательское представление MyView Я определяю некоторые пользовательские атрибуты:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView">
        <attr name="normalColor" format="color"/>
        <attr name="backgroundBase" format="integer"/>
    </declare-styleable>   
</resources>

И назначьте их следующим образом в макете XML:

    <com.example.test.MyView
        android:id="@+id/view1"
        android:text="@string/app_name"
        . . .
        app:backgroundBase="@drawable/logo1"
        app:normalColor="@color/blue"/>

Сначала я думал, что могу получить пользовательский атрибут backgroundBase, используя:

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getInteger(R.styleable.MyView_backgroundBase, R.drawable.blank);

Это работает только тогда, когда атрибут не назначен и возвращается по умолчанию R.drawable.blank.
Когда назначается app:backgroundBase, генерируется исключение "Невозможно преобразовать в целочисленный тип = 0xn", потому что, хотя формат пользовательских атрибутов объявляет его как целое, он действительно ссылается на Drawable и должен быть получен следующим образом:

Drawable base = a.getDrawable(R.styleable.MyView_backgroundBase);
if( base == null ) base = BitMapFactory.decodeResource(getResources(), R.drawable.blank);

И это работает.
Теперь мой вопрос:
Я действительно не хочу получать Drawable из TypedArray, я хочу, чтобы целочисленный идентификатор соответствовал app:backgroundBase (в приведенном выше примере это было бы R.drawable.logo1). Как я могу его получить?

4b9b3361

Ответ 1

Получается, что ответ был прямо там:

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getResourceId(R.styleable.MyView_backgroundBase, R.drawable.blank);