Reputation: 5543
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.
Upvotes: 5
Views: 1051
Reputation: 5186
I don't think you can do this , as R.java
is the file storing the instances(static) of all xmls inside it.Static means they need to stay in the memory before hand.Changing them on the fly does not seem probable.
Upvotes: 0
Reputation: 87064
...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.
Upvotes: 12