Программно изменить цвет формы в списке слоев

Как я могу программно изменить цвет (#000000) фигуры в списке слоев?

Вот мой список слоев:

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

Ответы

Ответ 1

Прежде всего, вам нужно назначить идентификатор вам layer-list.

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

Затем получите форму по id.

LayerDrawable shape = (LayerDrawable) getResources().getDrawable(R.drawable.your_shape)

И вы можете изменить цвет своей фигуры, позвонив

shape.setColor(Color.Black); // changing to black color

ИЗМЕНИТЬ

Как getDrawable() устарел. Используйте следующую строку кода.

LayerDrawable shape = (LayerDrawable) ContextCompat.getDrawable(YourActivity.this,R.drawable.your_shape)

Ответ 2

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

Затем в вашем коде просто добавьте

LayerDrawable layerDrawable = (LayerDrawable) getResources()
            .getDrawable(R.drawable.my_drawable);
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable
            .findDrawableByLayerId(R.id.gradientDrawble);
gradientDrawable.setColor(color); // change color

Обновление Oct-2016

getDrawable() теперь устарел, вы должны использовать вместо него ContextCompat.getDrawable(context, color).

Кроме того, если вы получили LayerDrawable на findDrawableByLayerId(), тогда вам нужно было позвонить view.setBackground(layerDrawable), чтобы это вступило в силу. В качестве альтернативы также выполнялось создание экземпляра LayerDrawable на view.getBackground().