20

Avere questa visualizzazione personalizzata MyView definisco alcuni attributi personalizzati:ottenere l'ID risorsa per il riferimento drawable utilizzato in attributo in stile

<?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> 

e assegnare loro come segue nel XML di layout:

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

All'inizio pensavo di poter recuperare l'attributo personalizzato backgroundBase utilizzando:

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

Che funziona solo quando l'attributo non è assegnato e viene restituito il valore predefinito R.drawable.blank.
Quando app:backgroundBase viene assegnato viene generata un'eccezione "Non riesci a convertire in numero intero type = 0xn" perché, anche se il formato attributo personalizzato dichiara come numero intero, in realtà fa riferimento a un Drawable e dovrebbe essere recuperate come segue:

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

E questo funziona.
Ora la mia domanda:
Io davvero non voglio ottenere il Drawable dal TypedArray, voglio che il numero intero id corrispondente al app:backgroundBase (nell'esempio di cui sopra sarebbe R.drawable.logo1). Come posso averlo?

risposta

36

Si scopre che la risposta era proprio lì:

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

qualche chiarimento che mi hanno aiutato: il 'R.drawable.blank' è la risorsa di default nel caso in cui quella richiesta non esiste – HaydenKai