Измените xml StateListDrawable из java

У меня есть drawable, определенный в res/drawable/my_background.xml.

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">
 </rotate></item>
 
 </item></layer-list>
 </item>
 <item>
 <layer-list>
 <item android:drawable="@drawable/product_background_1">
 <item android:drawable="@drawable/product_background_2">
 </item></item></layer-list>
 </item>
</selector>

Затем я устанавливаю my_background как доступный для просмотра, и это отлично работает.

Но мне нужно изменить значение элемента цвета, которое хранится в layerList в моем селекторе из моего java-кода. Как это сделать?

Я могу вызвать getBackground() на моем представлении, а затем получить StateListDrawable, но я не могу найти какой-либо метод для получения drawable children из StateListDrawable.

2 ответа

... но я не могу найти какой-либо метод для того, чтобы выталкивать детей из StateListDrawable.

Вы можете получить доступ к дочерним элементам, хотя класс DrawableContainerState суперкласса DrawableContainer. Этот класс имеет метод getChildren(), который возвращает массив, содержащий два LayerDrawable. Затем вы можете манипулировать теми, которые можно извлечь, чтобы добраться до целевого объекта:

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

Начиная с KitKat (API-уровень 19) DrawableContainerState предоставляет метод getChild(), поэтому вы можете напрямую получить правильный LayerDrawable.


Я не думаю, что вы можете это сделать, так как R.java - это файл, в котором хранятся экземпляры (статические) всех xmls внутри него. Static означает, что им нужно оставаться в памяти перед рукой. Замена их на лету не представляется вероятным.

licensed under cc by-sa 3.0 with attribution.