I have a drawable defined in res/drawable/my_background.xml.
my_background.xml is:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<layer-list >
<item android:drawable="@drawable/product_background_1" />
<item>
<rotate
android:fromDegrees="180"
android:toDegrees="180"
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@drawable/product_background_2"
android:id="@+id/need_to_change_this_color_from_java" />
</item>
<item><color android:color="#4400aa00"/></item>
</layer-list>
</item>
<item>
<layer-list >
<item android:drawable="@drawable/product_background_1" />
<item android:drawable="@drawable/product_background_2" />
</layer-list>
</item>
</selector>
I then set my_background as drawable on a view and that works fine.
But I need to change the value of a color element which is stored in a layerList in my selector from my java code. How do I do that?
I can call getBackground() on my view, and then get a StateListDrawable, but I can't find any method to get the drawable children from a StateListDrawable.
...but I can't find any method to get the drawable children from a StateListDrawable.
You can access the children though the DrawableContainerState
class of the super class DrawableContainer
. That class has a getChildren()
method which will return an array containing the two LayerDrawable
. You can then further manipulate those drawable to get to the target drawable:
StateListDrawable sld = (StateListDrawable) theView.getBackground();
DrawableContainerState dcs = (DrawableContainerState) sld.getConstantState();
Drawable[] children = dcs.getChildren();
RotateDrawable target = (RotateDrawable) ((LayerDrawable) children[0]).getDrawable(1); // or use the id
// use target to change the color
Starting with KitKat(API level 19) DrawableContainerState
exposes a getChild()
method so you can retrieve the proper LayerDrawable
directly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With