MTilsted
MTilsted

Reputation: 5543

Modify an xml StateListDrawable from java

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

Answers (2)

cafebabe1991
cafebabe1991

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

user
user

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

Related Questions