2012-02-22 18 views
39

Sto cercando di ottenere il riferimento di puntamento da un attributo tramite codice. Nei miei schemi XML che posso facilmente ottenere il drawable si fa riferimento in questo modo:Come ottenere il riferimento attr in codice?

android:background="?attr/listItemBackground" 

Il riferimento attributo è impostato dal mio tema. Sto cercando di vedere se è possibile ottenere quel drawable di riferimento tramite il codice.

Posso aggirare questo creando lo stile attr e leggendo il valore all'interno di una vista personalizzata ma in questo caso voglio capire se questo è possibile senza fare tutto ciò. Penserei che sarebbe possibile ma non ho trovato modi per ottenere quel riferimento di attributo.

Grazie!

risposta

99

Ecco come si fa it:

// Create an array of the attributes we want to resolve 
// using values from a theme 
int[] attrs = new int[] { R.attr.listItemBackground /* index 0 */}; 

// Obtain the styled attributes. 'themedContext' is a context with a 
// theme, typically the current Activity (i.e. 'this') 
TypedArray ta = themedContext.obtainStyledAttributes(attrs); 

// To get the value of the 'listItemBackground' attribute that was 
// set in the theme used in 'themedContext'. The parameter is the index 
// of the attribute in the 'attrs' array. The returned Drawable 
// is what you are after 
Drawable drawableFromTheme = ta.getDrawable(0 /* index */); 

// Finally, free the resources used by TypedArray 
ta.recycle(); 
+1

Grazie per la risposta. Questo sembra essere l'unico modo per farlo. – Jona

+0

L'ho provato ma non funzionerà usando l'indice 0, ma piuttosto 1 (che è ciò che viene restituito da 'getIndex (0)'. –

+0

Ho dovuto sostituire R.attr.listItemBackground con R.attr.selectableItemBackground per questo per compilare – dimsuz

0

non si dovrebbe utilizzare:

android:background="@drawable/listItemBackground"

E poi:

myImageButton.getBackgroundDrawable()

O forse non ho capito ...

+0

L'idea è che voglio accedere alla risorsa di riferimento da attr/listItemBackground che ha il set di riferimento appropriato tramite theme.xml Ottenere uno sfondo già impostato da una vista non è il problema :) – Jona

+0

Ok capito! Penso che sia possibile cercando di ottenere direttamente "? Attr/listItemBackground" da context.getResources(). Ma penso anche che ci siano soluzioni migliori rispetto ai referenti drawable. Possiamo discutere dell'idea principale? (oppure no se pensi che questa soluzione sia la migliore) –

+0

Bene, ho un tema complesso ma organizzato per la mia app. Ma in questo caso ho voluto vedere se fosse possibile e come sarebbe stato possibile utilizzarlo. Si potrebbe pensare che res.getDrawable (R.attr.listItemBackground) lo esegua poiché la risorsa è già impostata correttamente con il tema corrente impostato e punta alla risorsa corretta. Ma è un po 'più complesso di quello che sembra ... – Jona

Problemi correlati