Work-in-progress concept of a LESS-style DSL for generating Android resources.
Android theming and styling is an extremely powerful tool when used correctly. However, complex applications can have hundreds of styles scattered throughout tens of resource folders. When altering or debugging these styles it is sometime not always clear where problems are originating.
Cascading style sheets suffer from the same problem and there has been numerous movements over the last few years to attempt to solve this problem. One of the most popular frameworks, LESS, uses a simple, hierarchical DSL while adding new features such as constants and mixins.
By taking a cue from LESS it should be possible to create a more terse DSL which would allow for more effective style management on Android. This file would be parsed at build-time and converted into its respective set of resource folders and files.
Currently this is only being developed as a concept for possible future implementation. Android styling is much more complex than CSS (having things such as inheritance and namespaces) so much care will need to be taken to develop the DSL to be both powerful yet simple to understand and create.
//Declaring styles ~SherlockTheme: actionBarStyle : reference actionModeStyle: reference ~SherlockActionBar: //Enums get bitwise values by default displayOptions: showHome, homeAsUp, showTitle //You can also explicitly declare values navigationMode: standard: 0x01 list : 0x08 tabs : 0x04 //Constants are converted to resources as well @primary_color: #ffa36e2b @secondary_color: #ff9adb51 @height: 60dp //Mixin to add height to a style .actionheight: height: @height MyTheme: //Specify the parent on pre/post API 11 ^ Theme.Light ^-v11 Theme.Holo.Light textColorPrimary: @primary_color textColorSecondary: @secondary_color actionBarStyle: displayOptions: showHome|homeAsUp .actionheight //Use tabs on large devices navigationMode : list navigationMode-large: tabs actionModeStyle: background: @drawable/action_mode .actionheight buttonStyle: background: @drawable/my_button
<!-- values/lessres.xml --> <resources> <declare-styleable name="SherlockTheme"> <attr name="actionBarStyle" format="reference" /> <attr name="actionModeStyle" format="reference" /> </declare-styleable> <declare-styleable name="SherlockActionBar"> <attr name="displayOptions"> <item name="showHome" value="1"/> <item name="homeAsUp" value="2"/> <item name="showTitle" value="4"/> </attr> <attr name="navigationMode"> <item name="standard" value="1"/> <item name="list" value="8"/> <item name="tabs" value="4"/> </attr> </declare-styleable> <color name="primary_color">#ffa36e2b</color> <color name="secondary_color">#ff9adb51</color> <dimen name="height">60dp</dimen> <style name="MyTheme" parent="android:Theme.Light"> <item name="actionBarStyle">@style/MyTheme_actionBarStyle</item> <item name="actionModeStyle">@style/MyTheme_actionModeStyle</item> <!-- Attributes not in declares so assume android namespace --> <item name="android:textColorPrimary">@color/primary_color</item> <item name="android:textColorSecondary">@color/secondary_color</item> <item name="android:buttonStyle">@style/MyTheme_buttonStyle</item> </style> <style name="MyTheme_actionBarStyle" parent="android:Widget"> <item name="displayOptions">showHome|homeAsUp</item> <item name="android:height">@dimen/height</item> <item name="navigationMode">list</item> </style> <style name="MyTheme_actionModeStyle" parent="android:Widget"> <item name="android:background">@drawable/bg_action_mode</item> <item name="android:height">@dimen/height</item> </style> <!-- Automatically inherits from parent theme style --> <style name="MyTheme_buttonStyle" parent="android:Widget.Button"> <item name="android:background">@drawable/my_button</item> </style> </resources> <!-- values-large/lessres.xml --> <resources> <style name="MyTheme_actionBarStyle" parent="android:Widget"> <item name="displayOptions">showHome|homeAsUp|showTitle</item> <item name="android:height">@dimen/height</item> <item name="navigationMode">tabs</item> </style> </resources> <!-- values-v11/lessres.xml --> <resources> <style name="MyTheme" parent="android:Theme.Holo.Light"> <item name="actionBarStyle">@style/MyTheme_actionBarStyle</item> <item name="actionModeStyle">@style/MyTheme_actionModeStyle</item> <!-- Attributes not in declares so assume android namespace --> <item name="android:textColorPrimary">@color/primary_color</item> <item name="android:textColorSecondary">@color/secondary_color</item> <item name="android:buttonStyle">@style/MyTheme_buttonStyle</item> </style> <!-- Automatically inherits from parent theme style --> <style name="MyTheme_buttonStyle" parent="android:Widget.Holo.Button"> <item name="android:background">@drawable/my_button</item> </style> </resources>