web-dev-qa-db-fra.com

Modifier par programme la couleur de la forme dans la liste des calques

Comment puis-je modifier par programme la couleur (#000000) d'une forme dans une liste de calques?

Voici ma liste de couche:

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

Tout d’abord, vous devez attribuer un identifiant à votre élément 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>

Ensuite, obtenez votre forme par identifiant.

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

Et vous pouvez changer la couleur de votre forme en appelant

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

MODIFIER

Comme getDrawable() est obsolète. Utilisez la ligne de code suivante.

LayerDrawable shape = (LayerDrawable) ContextCompat.getDrawable(YourActivity.this,R.drawable.your_shape)
16
Noman Rafique
<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>

Ensuite, dans votre code, ajoutez simplement

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

Mise à jour octobre 2016

getDrawable() est maintenant obsolète, vous devriez plutôt utiliser ContextCompat.getDrawable(context, color).

De plus, si vous obtenez LayerDrawable par findDrawableByLayerId(), vous devez appeler view.setBackground(layerDrawable) pour que cela prenne effet. Une autre possibilité consistait à instancier layerDrawable par view.getBackground().

48
Suhail Mehta
<?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>

Trouvez votre vue

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

Définir la couleur

outer.setColor(Color.parseColor(#000000));
inner.setColor(Color.parseColor(#FFFFFF));
2
Ketan Ramani

Vous pouvez également obtenir le dessin ou l’arrière-plan de la vue et le définir comme suit.

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));
0
Anoop M