2012-11-22 5 views
7

Voglio creare una classe personalizzata che prende un colore come uno dei suoi attributi quando è disposto in un file XML Android. Tuttavia, un colore potrebbe essere una risorsa o potrebbe essere una delle numerose specifiche di colore diretto (es. Un valore esadecimale). Esiste un semplice metodo preferito per l'utilizzo di AttributeSet per recuperare il colore, poiché un numero intero che rappresenta un colore potrebbe fare riferimento a un valore di risorsa oa un valore ARGB?Come posso ottenere un colore in modo affidabile da un AttributeSet?

risposta

22

Diciamo che hai definito il tuo attributo di colore personalizzato come questo:

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

Poi nel costruttore della visualizzazione, è possibile recuperare il colore in questo modo:

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(); 
    } 
} 

Non lo sai in realtà si deve preoccupare di come l'attributo di colore è stato popolato, sia come questo

<com.test.ColorView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:my_color="#F00" 
    /> 

o simili:

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

Procedimento getColor restituirà un valore di colore in ogni caso.

+3

Impressionante, grazie! (Anche un buon uso di '# F00' :)) –

+9

Non dimenticare di riciclare il tuo' TypedArray'. –

Problemi correlati