1

我在两个地方使用了这个 xml,我以编程方式改变了其中一个的颜色,我发现另一个的颜色也改变了,为什么会这样?

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

1 回答 1

0

使用Drawable.mutate().

即使每次Drawable从资源加载一个新实例时,出于性能原因,它们都共享ConstantState. 这ConstantState通常包含可以为 a 声明的所有属性,Drawable在您的示例中它的颜色。

因此,如果您修改其中一个更改的颜色,Drawables则更改会反映在其中ConstantState,并且更改对于共享相同的所有其他实例都是可见的ConstantState

作为Drawable.mutate()国家的文件:

使这个drawable可变。此操作无法撤消。保证可变的可绘制对象不会与任何其他可绘制对象共享其状态。当您需要修改从资源加载的可绘制对象的属性时,这尤其有用。默认情况下,从同一资源加载的所有可绘制实例共享一个公共状态;如果您修改一个实例的状态,所有其他实例将收到相同的修改。

您可以查看Romain Guy 的这篇很棒的帖子以了解更多详细信息

于 2016-11-24T08:38:29.590 回答