Проблемы изменения цвета фасонного
Я использую этот xml в двух местах, и я изменил цвет одного из двух программно, я обнаружил, что цвет другого также изменился, почему это может быть?
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/blue" />
<corners android:radius="2dp" />
</shape>
1 ответ
Использование Drawable.mutate()
,
Хотя каждый раз, когда вы загружаете Drawable
из ресурсов, которые вы получаете новый экземпляр, по соображениям производительности, они все разделяют ConstantState
, это ConstantState
обычно содержит все свойства, которые могут быть объявлены для Drawable
, его цвет в вашем примере.
Поэтому, если вы измените цвет одного из Drawables
изменение отражается в его ConstantState
и изменение видно для всех других экземпляров, которые имеют одинаковые ConstantState
,
Как документация Drawable.mutate()
состояния:
Сделайте это рисование изменчивым. Эта операция не может быть отменена. Изменяемый объект рисования гарантированно не разделяет его состояние с любым другим объектом рисования. Это особенно полезно, когда вам нужно изменить свойства рисованных объектов, загруженных из ресурсов. По умолчанию все экземпляры drawables, загруженные из одного и того же ресурса, имеют общее состояние; если вы измените состояние одного экземпляра, все остальные экземпляры получат такую же модификацию.
Вы можете проверить этот великий пост от Romain Guy для более подробной информации.