Wie kann ich die Farbe (#000000
) einer Form in einer Ebenenliste programmgesteuert ändern?
Hier ist meine Ebenenliste:
<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>
Als Erstes müssen Sie Ihrem layer-list
-Element eine ID zuweisen.
<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>
Dann bekomme deine Form durch die ID.
LayerDrawable shape = (LayerDrawable) getResources().getDrawable(R.drawable.your_shape)
Und Sie können die Farbe Ihrer Form ändern, indem Sie anrufen
shape.setColor(Color.Black); // changing to black color
EDIT
Da getDrawable()
abgelehnt wurde. Verwenden Sie die folgende Codezeile.
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>
Dann fügen Sie einfach den Code hinzu
LayerDrawable layerDrawable = (LayerDrawable) getResources()
.getDrawable(R.drawable.my_drawable);
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable
.findDrawableByLayerId(R.id.gradientDrawble);
gradientDrawable.setColor(color); // change color
Update Oktober 2016
getDrawable()
ist nun veraltet, Sie sollten stattdessen ContextCompat.getDrawable(context, color)
verwenden.
Wenn Sie LayerDrawable
von findDrawableByLayerId()
erhalten, müssen Sie view.setBackground(layerDrawable)
aufrufen, damit dies wirksam wird. Alternativ funktionierte auch das Instantiieren der layerDrawable
durch 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>
Finden Sie Ihre Ansicht
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);
Farbe einstellen
outer.setColor(Color.parseColor(#000000));
inner.setColor(Color.parseColor(#FFFFFF));
Sie können auch den Hintergrund der Ansicht zeichnen und wie folgt festlegen.
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));