2012-11-22 8 views
7

Ich möchte eine benutzerdefinierte Klasse erstellen, die eine Farbe als eines ihrer Attribute annimmt, wenn sie in einer Android-XML-Datei angeordnet ist. Eine Farbe könnte jedoch eine Ressource sein oder eine direkte Farbspezifikation (z. B. ein Hexadezimalwert). Gibt es eine einfache bevorzugte Methode, AttributeSet zu verwenden, um die Farbe abzurufen, da eine Ganzzahl, die eine Farbe darstellt, sich entweder auf einen Ressourcenwert oder einen ARGB-Wert beziehen könnte?Wie kann ich zuverlässig eine Farbe von einem AttributeSet erhalten?

Antwort

22

Angenommen, Sie haben Ihre eigene Farb Attribut wie folgt definiert:

<declare-styleable name="color_view"> 
    <attr name="my_color" format="color" /> 
</declare-styleable> 

Dann im Konstruktor Ihrer Ansicht nach können Sie die Farbe wie folgt abrufen:

public ColorView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.color_view); 
    try { 
     int color = a.getColor(R.styleable.color_view_my_color, 0); 
     setBackgroundColor(color); 
    } finally { 
     a.recycle(); 
    } 
} 

Sie dies nicht tun tatsächlich müssen Sie sich sorgen, wie das Farbattribut ausgefüllt wurde, entweder

oder so:

<com.test.ColorView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:my_color="@color/red" 
    /> 

getColor Die Methode wird ein Farbwert in jedem Fall zurück.

+3

Ehrfürchtig, danke! (Nette Verwendung von '# F00' auch :)) –

+9

Vergessen Sie nicht, Ihre' TypeArray' zu recyceln. –

Verwandte Themen