Programmatically change color of shape in layer list

user picture user · Aug 23, 2015 · Viewed 19.5k times · Source

How can I programmatically change the color (#000000) of a shape in a layer list?

Here is my layer list:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <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>

Answer

Suhail Mehta picture Suhail Mehta · Aug 23, 2015
<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.