我在两个地方使用了这个 xml,我以编程方式改变了其中一个的颜色,我发现另一个的颜色也改变了,为什么会这样?
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/blue" />
<corners android:radius="2dp" />
</shape>
我在两个地方使用了这个 xml,我以编程方式改变了其中一个的颜色,我发现另一个的颜色也改变了,为什么会这样?
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/blue" />
<corners android:radius="2dp" />
</shape>
使用Drawable.mutate()
.
即使每次Drawable
从资源加载一个新实例时,出于性能原因,它们都共享ConstantState
. 这ConstantState
通常包含可以为 a 声明的所有属性,Drawable
在您的示例中它的颜色。
因此,如果您修改其中一个更改的颜色,Drawables
则更改会反映在其中ConstantState
,并且更改对于共享相同的所有其他实例都是可见的ConstantState
。
作为Drawable.mutate()
国家的文件:
使这个drawable可变。此操作无法撤消。保证可变的可绘制对象不会与任何其他可绘制对象共享其状态。当您需要修改从资源加载的可绘制对象的属性时,这尤其有用。默认情况下,从同一资源加载的所有可绘制实例共享一个公共状态;如果您修改一个实例的状态,所有其他实例将收到相同的修改。