Проблемы изменения цвета фасонного

Я использую этот 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 для более подробной информации.

Другие вопросы по тегам