Establecimiento de un color basado en el tema

Tengo un color de acento que utilizo a través de mis diseños. Lo he definido como un estilo que aplico a un TextView.

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

  • No se puede definir un color en un tema
  • No se puede definir un color de lista de estado basado en el tema
  • No puede separar los recursos según el tema (como puede para la versión o el tamaño de la pantalla)
  • No se puede actualizar el color del recurso desde el código (??? no 100% en este ???)

¿Cómo debo controlar mi color de acento según el tema seleccionado?

La guía de dev da un ejemplo de un tema usando 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 los lugares de X donde este estilo se está utilizando podría ferrit hacia fuera el componente y fijar el color esa manera. Pero yo creo que podría lograr esto con alguna combinación de estilo / tema.

Gracias

Luché con la misma pregunta y estaba cerca de hacer algo similar a lo que se le ocurrió afortunadamente he encontrado la siguiente solución que también he indicado aquí .

Primero defina 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, defina 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> 

Parece que no hay ninguna explicación en la documentación oficial de Android sobre el uso de atributos. El mejor recurso que encontré está aquí .

La forma en que resolvió esto fue mediante la creación de subclases de la android.widget.TextView. He creado un TextViewAccented y un TextViewWarning. Yo uso estos TextViews en mi XML donde quiero el acento o color de advertencia. Quitar cualquier referencia de color del XML.

Las subclases contienen los tres constructores predeterminados. Los tres constructores llaman un método privado llamado setColor (). setColor () entonces inspecciona el tema seleccionado y puede usar el tono deseado basado en el tema seleccionado actualmente.

Es un mecanismo bastante limpio, pero es difícil creer que no puedo codificar esto en un tema. Eso parece exactamente lo que un tema debe ser.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.