How to dynamically pass color value in xml

I have xml that will draw an oval shape, the code below:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#61118"/> <stroke android:width="1sp" android:color="#1B434D" /> </shape> 

Now I am here android:color="#61118" I need to pass a value from the java class, is this possible?

If there is no alternative way?

+4
source share
2 answers

Unfortunately, you cannot pass arguments to XML Drawables.

If you have too many different values, you can use <level-list> and provide different versions of your figure.

Then you will change the level associated with your drawable to change the color using Drawable.setLevel(int) .


my_drawable.xml

 <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:maxLevel="0"> <shape android:shape="oval"> <solid android:color="@color/red"/> <stroke android:width="1sp" android:color="@color/border" /> </shape> </item> <item android:maxLevel="1"> <shape android:shape="oval"> <solid android:color="@color/green"/> <stroke android:width="1sp" android:color="@color/border" /> </shape> </item> <item android:maxLevel="2"> <shape android:shape="oval"> <solid android:color="@color/blue"/> <stroke android:width="1sp" android:color="@color/blue" /> </shape> </item> </level-list> 

MyActivity.java

 // myView is a View (or a subclass of View) // with background set to R.drawable.my_drawable myView.getBackground().setLevel(0); // Set color to red myView.getBackground().setLevel(1); // Set color to green myView.getBackground().setLevel(2); // Set color to blue // myImageView is an ImageView with its source // set to R.drawable.my_drawable myImageView.setImageLevel(0); // Set color to red myImageView.setImageLevel(1); // Set color to green myImageView.setImageLevel(2); // Set color to blue 
+5
source

Yes, you can change the shape color dynamically. Suppose your xml is included, 'res / drawable / oval_shape.xml'

 GradientDrawable shape = (GradientDrawable) getResources().getDrawable(R.drawable.oval_shape); int argb = 0x12345678; shape.setBackground( argb ); 

if you want to change the color of the frame

 int width = 1; int argb = 0x87654321; shape.setStroke( width, argb ); 

This solution provides more flexibility when using the level list because you are not tied to using the view to set the level.

+1
source

All Articles