2016-11-24 37 views
1

我在两个地方使用这个xml,并且我通过编程改变了其中一个的颜色,我发现另一个人的颜色也发生了变化,为什么会这样呢?改变可成形的颜色的问题

<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()状态的文档:

使此绘制可变的。这个操作不能逆转。一个可变的drawable保证不与其他drawable共享它的状态。当你需要修改从资源加载的drawable的属性时,这是特别有用的。默认情况下,从同一资源加载的所有可绘制实例共享一个公共状态;如果修改一个实例的状态,则所有其他实例都将收到相同的修改。

你可以检查这个伟大的post by Romain Guy for more details

+0

它的作品,thx! – tysheng