Получить идентификатор ресурса для отрисовываемой ссылки, используемой в стилизованном атрибуте
Имея этот пользовательский вид 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
назначено исключение выдается "Не удается преобразовать в целое число type=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
). Как я могу получить это?
1 ответ
Оказывается, ответ был тут же:
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getResourceId(R.styleable.MyView_backgroundBase, R.drawable.blank);