2011-12-25 18 views
18

Estoy bastante seguro de que esta pregunta ya ha sido respondida en alguna parte. Simplemente parece demasiado común. Pero no puedo encontrar la respuesta. No puedo resolver la solución.Colores dependientes del tema de los widgets seleccionados

aquí está el problema:

quiero uno de mis TableRow de tener diferente color de fondo. Es muy sencillo, sólo hay que añadir

android:background="#123456" 

En la declaración XML del TableRow. Pero, también quiero que mi aplicación tenga dos temas. En el otro tema, el TableRow debe tener un color de fondo diferente. Simplemente no puedo encontrar una manera de definir un valor de color dentro de un tema y usarlo. Me gustaría escribir algo como esto:

<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> 

Y, en la declaración de TableRow:

android:background="@color/my_cool_color" 

Así, cuando cambio el tema, el color de fondo que uno de TableRow también cambia. Lo intenté de muchas maneras durante muchas horas y no tuve éxito ... Una cosa que no probé fue crear mi propio widget basado en TableRow y declarar un estilo separado para él. Creo que esto debería funcionar, pero es solución demasiado pesada para un problema tan simple.

Respuesta

51

Puede hacerlo utilizando los atributos. En primer lugar definir su atributo en attrs.xml (este archivo pasa por debajo de la carpeta 'valores'):

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

Luego, en su styles.xml, definir myCoolColor para cada 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> 

Ahora, especifique myCoolColor como el fondo de su vista:

android:background="?myCoolColor" 

Puede ir más allá y utilizar una referencia a un color para que pueda mantener sus colores definidos i n un solo lugar Cambie el atributo de incluir una referencia (en cuenta que podemos utilizar un color o una referencia):

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

Cambiar la styles.xml para hacer referencia a un color para cada 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> 

definen Finalmente los colores de su colors.xml:

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

eso es todo!

+0

Gracias! Encontré algo sobre attr.xml, pero no pude encontrar un ejemplo adecuado. ¡Por el contrario, tu respuesta no podría ser más completa! – user1234567

+0

Su respuesta me resultó muy útil y también resolvió mi problema. +1. Pero todavía tengo un problema, quiero usar los colores definidos en el código. ¿Cómo puedo hacer eso, cómo usar los colores de attrs en código (no xml)? – Sandra

+0

Sí, pero si uso el tema oscuro, quiero que el color sea azul y el otro verde. Pero, ¿cómo puedo obtener el color correcto en el código? – Sandra

Cuestiones relacionadas