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