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?
eine Klarstellung, die mir geholfen haben würde: die 'R.drawable.blank' ist die Standard-Ressource, falls die angeforderten nicht existiert – HaydenKai