android - varias - Obtenga el ID de recurso para la referencia dibujable utilizada en el atributo de estilo
selectores avanzados css (1)
Resulta que la respuesta estaba ahí:
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getResourceId(R.styleable.MyView_backgroundBase, R.drawable.blank);
Teniendo esta vista personalizada MyView
defino algunos atributos personalizados:
<?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>
Y asignarlos de la siguiente manera en el diseño XML:
<com.example.test.MyView
android:id="@+id/view1"
android:text="@string/app_name"
. . .
app:backgroundBase="@drawable/logo1"
app:normalColor="@color/blue"/>
Al principio pensé que podía recuperar el atributo personalizado backgroundBase
usando:
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getInteger(R.styleable.MyView_backgroundBase, R.drawable.blank);
Lo que funciona solo cuando el atributo no está asignado y se devuelve el R.drawable.blank
predeterminado.
Cuando se asigna una excepción a la app:backgroundBase
se asigna una base de app:backgroundBase
"No se puede convertir al tipo de entero = 0xn" porque, aunque el formato de atributo personalizado lo declara como entero, realmente hace referencia a un Drawable
y se debe recuperar de la siguiente manera:
Drawable base = a.getDrawable(R.styleable.MyView_backgroundBase);
if( base == null ) base = BitMapFactory.decodeResource(getResources(), R.drawable.blank);
Y esto funciona.
Ahora mi pregunta:
Realmente no quiero obtener el Drawable
de TypedArray, quiero el ID entero correspondiente a app:backgroundBase
(en el ejemplo anterior sería R.drawable.logo1
). ¿Cómo puedo obtenerlo?