2012-04-12 9 views
3

Ich versuche, eine benutzerdefinierte Komponente zu erstellen, die von RelativeLayout erbt.So lesen Sie Android: src in meiner benutzerdefinierten Komponente

In meiner XML-Layout-Datei, die ich habe:

<Mycomponent 
    android:src="@drawable/my_test_image"> 
     <TestView> 
</Mycomponent> 

Meine Frage ist, wie kann ich eine Drawable Klasse im Konstruktor von MyComponent erstellen?

Ich habe versucht, den Quellcode von ImageView zu lesen, aber es scheint versucht, einige Android Internal.R.

Gibt es sowieso, dass ich das in meinem Code tun kann.

Vielen Dank.

+0

Möchten Sie das Zeichen 'my_test_image' im Konstruktor der benutzerdefinierten Ansicht abrufen? – Luksprog

+0

Ja. Ich möchte ein Drawable-Objekt erstellen, indem ich das 'android: src' in der Layout-XML-Datei lese. – michael

Antwort

14

Ich denke Luksprog es ist falsch, ich habe eine einfache Lösung, die Sie benutzerdefinierte Komponente "src" Daten ohne styleable zugreifen, sondern nur die AttributeSet Aufruf:

attrs.getAttributeResourceValue ("http://schemas.android.com/apk/res/android", "src" , 0);

Hier können Sie mein Beispiel sehen, Bitmaps Größe billiger zu machen, jeje.

public CustomView(Context context, AttributeSet attrs) { 
super(context, attrs); 
int src_resource = attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/android", "src", 0); 
this.setImageBitmap(getDrawable(getResources(),src_resource)); 
} 

public static Bitmap getDrawable(Resources res, int id){ 
    return BitmapFactory.decodeStream(res.openRawResource(id)); 
} 

Nun werden Sie etwas in der xml wie dieses:

<com.example.com.jfcogato.mycomponent.CustomView 
    android:id="@+id/tAImageView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/big_image_example"/> 
+1

'this.setImageDrawable (getResources(). GetDrawable (src_resource))' ... sollte verwendet werden, um Zeichenarten aller Typen zu unterstützen. Dein Code unterstützt nur Bilder. –

1

ich auch Vorschläge gesehen haben, dass Sie dies tun können ...

int attributeIds[] = { android.R.attr.src }; 
    TypedArray a = context.obtainStyledAttributes(attributeIds); 
    int resourceId = a.getResourceId(0, 0); 
    a.recycle(); 

Meiner Erfahrung nach dieser Code kompiliert, gibt aber zur Laufzeit 0 zurück.

Also ja ... geh mit Jfcogato's Antwort oben.

Verwandte Themen