2012-02-02 17 views
15

Tengo un color de acento que uso a través de mis diseños. Lo tengo definido como un estilo que aplico a un TextView.Configuración de un color según el tema

Mi aplicación le permite al usuario elegir entre un tema oscuro y un tema claro. Me gustaría ajustar el color de acento en función del tema seleccionado.

  • No se puede definir un color en un tema
  • no se puede definir un color de la lista de estado basado en el tema
  • No se pueden separar los recursos basados ​​en el tema (como pueda para dicha versión o tamaño de la pantalla)
  • no se puede actualizar el color de recurso de código (??? no es 100% en esto ???)

¿Cómo debo controlar mi acento de color basado en el tema seleccionado?

La guía de desarrollo da un ejemplo de un tema que utiliza un color personalizado, que está cerca de lo que quiero. Necesito poder cambiar el color en tiempo de ejecución. Sé que podría entrar en mi código y la X indica dónde se está usando este estilo. Pude ferritar el componente y establecer el color de esa manera. Pero creo que podría lograr esto con alguna combinación de estilo/tema.

Gracias

Respuesta

0

La forma en que esto era resuelto mediante la creación de subclases de la android.widget.TextView. Creé TextViewAccented y TextViewWarning. Uso estos TextViews en mi XML donde quiero el acento o el color de advertencia. Elimino cualquier referencia de color del XML.

Las subclases contienen los tres constructores predeterminados. Los tres constructores llaman a un método privado llamado setColor(). setColor() luego inspecciona el tema seleccionado y puede usar el tono deseado en función del tema seleccionado actualmente.

Es un mecanismo bastante limpio, pero es difícil de creer que no pueda codificar esto en un tema. Eso parece exactamente para lo que debería ser un tema.

23

Tuve problemas con la misma pregunta y estuve cerca de hacer algo similar a lo que se te ocurrió pero afortunadamente encontré la siguiente solución que también dije here.

En primer lugar se definen los campos de color personalizados en attr.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

<attr name="titleColor" format="reference|color" /> 
<attr name="introColor" format="reference|color" /> 

</resources> 

A continuación, definir sus temas

<style name="AppTheme.MyLight" parent="android:Theme"> 
    <item name="titleColor">#FFFFFF</item> 
    <item name="introColor">#FFFFAA</item> 
</style> 


<style name="AppTheme.MyDark" parent="android:Theme"> 
    <item name="titleColor">#000000</item> 
    <item name="introColor">#004444</item> 
</style> 

y finalmente en su diseño

<TextView 
    android:id="@+id/quoteTitle" 
    android:textColor="?titleColor" 
    ... 
</TextView> 

<TextView 
    android:id="@+id/quoteIntro" 
    android:textColor="?introColor" 
    ... 
</TextView> 

No parece haber ninguna explicación en la documentación oficial de Android sobre el uso de atributos. El mejor recurso que encontré es here.

Cuestiones relacionadas