Permitir que los estilos sean temáticos

Tengo un problema simple. Me gustaría proporcionar múltiples temas para mi interfaz de usuario que un usuario puede cambiar entre

El problema es que puedo usar un tema que crea clases de interfaz de usuario primitivas, o puedo usar un estilo directamente en un elemento de diseño XML, pero no puedo definir un estilo que cambie en función del tema que he aplicado. No todo el estilo que quiero hacer se basa en el tipo primitivo.

Yo diría que lo que quiero hacer es similar a usar un selector CSS para diseñar una clase o un ID, pero los temas solo te permiten diseñar un nombre de elemento.


Lo mejor que puedo hacer ahora es tener un estilo base que hereda de cualquiera de los estilos reales que he construido, como a continuación:

Mi res / values ​​/ style.xml

// All styles have to be subclassed here to be made generic, and only one // can be displayed at a time. Essentially, I'm doing the same thing as setting // a theme does, but for styles. If I have 50 styles, I have to have 50 of // these for each theme, and that's not DRY at all! <style name="MyHeaderStyle" parent="MyHeaderStyle.Default"/> <!-- <style name="MyHeaderStyle" parent="MyHeaderStyle.Textures"/> --> <style name="MyHeaderStyle.Default"> <item name="android:background">@android:color/background_dark</item> </style> <style name="MyHeaderStyle.Textures"> <item name="android:background">@drawable/header_texture</item> </style> 

Uso en mi layout.xml:

 <!-- Note that I can't use a theme here, because I only want to style a SPECIFIC element --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" style="@style/MyHeaderStyle" android:gravity="center"> </LinearLayout> 

Pruebe este método:

1) Defina su propio archivo res/values/attrs.xml :

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="AppTheme"> <attr name="myLinearLayoutStyle" format="reference" /> </declare-styleable> </resources> 

2) Asignar el attr anterior a usted LinearLayout

 <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" style="?attr/myLinearLayoutStyle" android:gravity="center"> </LinearLayout> 

3) Asignar un estilo concreto a este attr:

 <style name="AppLightTheme" parent="android:Theme.Holo.Light"> <item name="@attr/myLinearLayoutStyle">@style/lightBackground</item> </style> <style name="AppTheme" parent="android:Theme.Holo"> <item name="@attr/myLinearLayoutStyle">@style/darkBackground</item> </style> <style name="lightBackground"> <item name="android:background">#D1CBF5</item> </style> <style name="darkBackground"> <item name="android:background">#351BE0</item> </style> 

Espero haber entendido bien su pregunta.

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