virgulilla varias selectores que mismo hijos excluir estilo elemento clases avanzados aplicar anidadas android custom-controls android-resources declare-styleable

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?