我在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获取可绘制的子节点。
答案 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的实例(静态)的文件。静态意味着他们需要在手中保留在内存中。将它们更改为苍蝇似乎不太可能。