2011-12-25 5 views
18

Sono abbastanza sicuro che questa domanda abbia già avuto risposta da qualche parte. Sembra solo troppo comune. Ma non riesco a trovare la risposta. Non riesco nemmeno a capire la soluzione.Colori dipendenti dai temi dei widget selezionati

Ecco il problema:

voglio un mio TableRow di avere il colore di sfondo diverso. È semplice, devo solo aggiungere

android:background="#123456" 

Nella dichiarazione XML di TableRow. Ma voglio anche che la mia applicazione abbia due temi. Nell'altro tema, il TableRow dovrebbe avere un diverso colore di sfondo. Non riesco a trovare un modo per definire un valore di colore all'interno di un tema e usarlo. Vorrei scrivere qualcosa di simile:

<style name="Theme.MyApp" parent="@style/Theme.Light"> 
    <color "my_cool_color">#123456</color> 
</style> 

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark"> 
    <color "my_cool_color">#654321</color> 
</style> 

E, nella dichiarazione di TableRow:

android:background="@color/my_cool_color" 

Così, quando cambio il tema, il colore dello sfondo che la propria TableRow cambia. Ho provato in molti modi per molte ore e non ho avuto successo ... Una cosa che non ho provato, è stata la creazione del mio widget basandomi su TableRow e dichiarando uno stile separato per esso - Penso che questo dovrebbe funzionare, ma è soluzione troppo pesante per un problema così semplice.

risposta

51

È possibile farlo utilizzando gli attributi. Prima di definire l'attributo in attrs.xml (questo file va sotto la cartella 'valori'):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="myCoolColor" format="color" /> 
</resources> 

Poi, nel tuo styles.xml, definire myCoolColor per ogni tema:

<style name="Theme.MyApp" parent="@style/Theme.Light"> 
    <item name="myCoolColor">#123456</item> 
</style> 

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark"> 
    <item name="myCoolColor">#654321</item> 
</style> 

Ora, specificare myCoolColor come sfondo della vista:

android:background="?myCoolColor" 

si può andare oltre e utilizzare un riferimento ad un colore in modo da poter mantenere i colori definiti i n un posto. Modificare l'attributo di inserire un riferimento (notare che possiamo utilizzare un colore o un riferimento):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="myCoolColor" format="color|reference" /> 
</resources> 

Cambia la tua styles.xml fare riferimento a un colore per ciascun tema:

<style name="Theme.MyApp" parent="@style/Theme.Light"> 
    <item name="myCoolColor">@color/blue</item> 
</style> 

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark"> 
    <item name="myCoolColor">@color/green</item> 
</style> 

definiscono infine i colori il tuo colors.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="blue">#0000FF</color> 
    <color name="green">#00FF00</color> 
</resources> 

Questo è tutto!

+0

Grazie! Ho trovato qualcosa su attr.xml, ma non ho trovato un esempio adatto. Al contrario, la tua risposta non potrebbe essere più completa! – user1234567

+0

Ho trovato la tua risposta molto utile e ho risolto anche il mio problema. +1. Ma ho ancora un problema, voglio usare i colori definiti nel codice. Come posso farlo, come usare i colori di attrs nel codice (non in xml)? – Sandra

+0

Sì, ma se uso il tema scuro voglio che il colore sia blu e per l'altro verde. Ma come posso ottenere il colore giusto nel codice? – Sandra