Home » Android » android – Programmatically change color of shape in layer list

android – Programmatically change color of shape in layer list

Posted by: admin April 23, 2020 Leave a comment

Questions:

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>
How to&Answers:

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)

Answer:

<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.

Answer:

<?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));

Answer:

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));