从java修改xml StateListDrawable

时间:2014-01-30 15:49:54

标签: android drawable

我在res / drawable / my_background.xml中定义了一个drawable。

my_background.xml是:

<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>

然后我将my_background设置为可绘制的视图,并且工作正常。

但我需要从我的java代码中更改存储在我的选择器的layerList中的color元素的值。我该怎么做?

我可以在我的视图上调用getBackground(),然后获取StateListDrawable,但是我找不到任何方法来从StateListDrawable获取可绘制的子节点。

2 个答案:

答案 0 :(得分:12)

  

...但是我找不到任何方法来从a中获取可绘制的孩子   StateListDrawable。

您可以通过超类DrawableContainerState的{​​{1}}类访问子节点。该类有一个getChildren()方法,它将返回一个包含两个DrawableContainer的数组。然后,您可以进一步操纵那些drawable以获得目标drawable:

LayerDrawable

从KitKat开始(API级别19)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 公开DrawableContainerState方法,以便您可以直接检索正确的getChild()

答案 1 :(得分:0)

我认为你不能这样做,因为R.java是存储其中所有xmls的实例(静态)的文件。静态意味着他们需要在手中保留在内存中。将它们更改为苍蝇似乎不太可能。