I'm trying to reuse primitive shapes and compose much of my user interface using these declarative XML elements.
But I do not want to create a separate XML file for each attribute value, and their permutations, and in the process duplicate much of the work.
For instance, I would like the consumer of this shape be able to define the android:radius value?
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#449def"
android:endColor="#2f6699"
android:angle="270"/>
<stroke
android:width="1dp"
android:color="#2f6699"/>
<corners
android:radius="3dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/shape_box_round_blue_uniform" />
<!-- How to set the corner radius here? -->
<item android:drawable="@drawable/shape_box_round_blue" />
</selector>
An XML variable can be defined as a string or file reference variable. Regular XML variables and XML file reference variables can be defined in all host languages with a few exceptions. REXX supports file reference variables for XML. Java™ supports XML and file reference variables for XML.
You can create
style attributes
, which I think is what you are looking for. They basically are variable attributes. E.g. you can use this in your themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- You can define attributes here -->
<attr name="button_radius" format="reference" />
</resources>
Which defines a variable reference called: button_radius This can be used in Styles, or in layout xml files:
<!-- You can use them like so: -->
<style name="MyApp.Theme1" parent="android:Theme.Holo.Light">
<item name="button_radius">12</item>
</style>
<style name="MyApp.Theme2" parent="android:Theme.Holo.Light">
<item name="button_radius">36</item>
</style>
This way, by changing the theme, you can use the different values for your radius. Below is an UNTESTED example of how you would change your shape drawable:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#449def"
android:endColor="#2f6699"
android:angle="270"/>
<stroke
android:width="1dp"
android:color="#2f6699"/>
<corners
android:radius="?button_radius"/> <!-- NOTE the ?button_radius-->
</shape>
Users can simply apply a different style to use different attributes. I don't know if this example answers your question completele, but there's a lot you can do by declaring attributes in your themes. These attributes are dynamic references. For more info about the possibilities see this article
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With