问题描述
GradientDrawable setColor
在设置颜色之后,重新进页面,发现使用shape文件的地方,颜色都被改变为新设的颜色了。
问题的详细重现与细节
需要设置一个shape文件A做为背景颜色,在项目中需要动态的更改背景颜色,于是乎想到了使用GradientDrawable这个类来改变控件的背景颜色,使用起来很简单,前提是view的background属性为shape A
shape A文件:设置solid为浅蓝色。在drawable中
1 |
|
GradientDrawableActivity,有两个组建view,需要设置为shape A,但是solid是一个红色,一个蓝色,先设置background为shape A,然后在代码中动态改变颜色
1 | <View |
改变颜色的代码,在Activity中的onCreate中:
1 | View viewMyFuture = findViewById(R.id.view_my_future); |
点击按钮之后,跳转至ActivityB,在ActivityB中的view直接使用了shapeA,颜色就是浅蓝色,直接android:background=”@drawable/shapeA”
但是期望的颜色值是浅蓝色,最后发现颜色已经变成代码中最后设置的那个颜色:本例中已经变成了红色。。。
问题的分析
纠结。。因为shape A是从drawable中的xml文件定义中设置的,真的很震惊,感觉表现就是我在代码中修改了xml中定义的颜色值。。一直找了很多文档,最后偶然在官方文档中发现:
1 | /** |
注意这里的注释:
改变颜色会导致所有的实例,推荐改变颜色之前调用mutate
代码中修改setColor之前调用mutate,后续页面就可以正常展示shape A设定颜色了,好坑哦!注意看官方文档咯。
延伸
为什么changing color will affect all instances of a drawable loaded from a resource?
shape的xml文件要被使用,最终肯定还是会被转为Drawable,怀疑是xml转到Drawable的时候共享了mGradientState或者mFillPaint