20

diese benutzerdefinierte Ansicht MyView Mit definiere ich einige benutzerdefinierte Attribute:Lassen Sie sich die Ressource-ID für die ziehbar Referenz verwendet in gestylten Attribut

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

Und sie zuweisen, wie im Layout XML folgt:

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

Zuerst dachte ich, ich kann das benutzerdefinierte Attribut backgroundBase abrufen mit:

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

Dies funktioniert nur, wenn das Attribut nicht zugewiesen ist und der Standardwert R.drawable.blank zurückgegeben wird.
Wenn app:backgroundBase zugewiesen wird eine Ausnahme geworfen wird „konvertieren kann nicht Typ integer = 0xn“ da, auch wenn das benutzerdefinierte Attribut Format als Integer deklariert, es wie folgt wirklich eine Drawable verweist und sollte abgerufen werden:

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

Und das funktioniert.
Nun meine Frage:
Ich will nicht wirklich die Drawable vom TypedArray bekommen, möchte ich die ganze Zahl ID (im Beispiel oben es R.drawable.logo1 wäre) zu app:backgroundBase entspricht. Wie kann ich es bekommen?

Antwort

36

Es stellt sich heraus, dass die Antwort richtig war:

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

eine Klarstellung, die mir geholfen haben würde: die 'R.drawable.blank' ist die Standard-Ressource, falls die angeforderten nicht existiert – HaydenKai