2016-11-24 8 views
1

Я использую этот xml в двух местах, и я изменил цвет одного из двух программно, я узнал, что цвет другого тоже изменился, почему это может быть?проблемы с изменением цвета shaperawable

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/blue" /> 
    <corners android:radius="2dp" /> 
</shape> 

ответ

0

Drawable.mutate().

Несмотря на то, что каждый раз, когда вы загружаете Drawable из ресурсов, вы получаете новый экземпляр, по соображениям производительности, все они разделяют ConstantState. Этот ConstantState обычно содержит все свойства, которые могут быть объявлены для Drawable, его цвет в вашем примере.

Поэтому, если изменить цвет одного из Drawables изменения получает отражение в его ConstantState и изменение является видимым для всех других случаев, которые разделяют то же ConstantState.

В документации Drawable.mutate() состояний:

Сделать это вытяжка изменяемой. Эта операция не может быть отменена. Гарантируется, что изменчивый ресурс не будет делиться своим состоянием с любым другим ресурсом. Это особенно полезно, когда вам нужно изменить свойства загружаемых ресурсов из ресурсов. По умолчанию все экземпляры drawables, загруженные из одного ресурса, имеют общее состояние; если вы измените состояние одного экземпляра, все остальные экземпляры получат такую ​​же модификацию.

Вы можете проверить это замечательно post by Romain Guy for more details.

+0

Это работает, thx !! – tysheng