How can I programmatically change the color (#000000
) of a shape in a layer list?
Here is my layer list:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/outer">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:height="40dp" android:width="40dp"/>
<padding android:top="3dp" android:bottom="3dp" android:right="3dp" android:left="3dp"/>
<stroke
android:width="1dp"
android:color="#ffffff"/>
</shape>
</item>
<item android:id="@+id/middle">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:height="40dp" android:width="40dp"/>
<padding android:top="2dp" android:bottom="2dp" android:right="2dp" android:left="2dp"/>
<stroke
android:width="3dp"
android:color="#ffffff"/>
</shape>
</item>
<item android:id="@+id/inner">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:height="40dp" android:width="40dp"/>
<solid
android:color="#ffffff"/>
</shape>
</item>
</layer-list>
Find your view
LayerDrawable layerDrawable = (LayerDrawable) yourView.getBackground();
GradientDrawable outer = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.outer);
GradientDrawable middle = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.middle);
GradientDrawable inner = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.inner);
Set color
outer.setColor(Color.parseColor(#000000));
inner.setColor(Color.parseColor(#FFFFFF));
First of all you need to assign id to you layer-list
item.
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- First assign id to the list item-->
<item android:id="@+id/your_shape">
<shape android:shape="rectangle">
<solid android:color="#000000" />
</shape>
</item>
<item android:left="5dp">
<shape android:shape="rectangle">
<solid android:color="@color/bg" />
</shape>
</item>
</layer-list>
Then get your shape by id.
LayerDrawable shape = (LayerDrawable) getResources().getDrawable(R.drawable.your_shape)
And you can change the color of your shape by calling
shape.setColor(Color.Black); // changing to black color
EDIT
As getDrawable()
has been deprecated. Use the following line of code.
LayerDrawable shape = (LayerDrawable) ContextCompat.getDrawable(YourActivity.this,R.drawable.your_shape)
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/gradientDrawble"> // Give id
<shape android:shape="rectangle">
<solid android:color="#000000" /> // CHANGE THIS COLOR
</shape>
</item>
<item android:left="5dp">
<shape android:shape="rectangle">
<solid android:color="@color/bg" />
</shape>
</item>
</layer-list>
Then in you code just add
LayerDrawable layerDrawable = (LayerDrawable) getResources()
.getDrawable(R.drawable.my_drawable);
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable
.findDrawableByLayerId(R.id.gradientDrawble);
gradientDrawable.setColor(color); // change color
Update Oct-2016
getDrawable()
is now deprecated, you should use ContextCompat.getDrawable(context, color)
instead.
Beside, if you get the LayerDrawable
by findDrawableByLayerId()
, then you had to call view.setBackground(layerDrawable)
for this to take effect. Alternatively, instantiating the layerDrawable
by view.getBackground()
also worked.
You can also get the drawable or background of the view and set it as follows.
LayerDrawable layerDrawable = (LayerDrawable) view.getDrawable(); //view.getBackground()
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable
.findDrawableByLayerId(R.id.layer_list_item_id);
gradientDrawable.setColor(ContextCompat.getColor(getContext(), R.color.colorPrimary));