慎用getBackgound.setAlpha改变资源透明度

最近做项目遇到一个问题,进入一个页面后导致其他的页面背景色发生了变化,杀掉app进程后恢复,根据现象,单独进入出现问题的页面时正常,两个八竿子打不着的页面有这种必现的问题场景,一定是进入特定页面后改变了全局的某些设置,导致其他页面的背景色被改变。

一开始怀疑是修改了共同基类BaseActivity的背景主题色,但查看了下群组的源代码,发现并没有修改BaseActivity的相关属性,也没有调用公共UI的其他方法。并且在只保留布局文件的情况下进行复测,问题现象消失,排除了此种情况,怀疑为代码中进行了设置。

走读代码。在initView中发现了一个可疑的对象:

groupStatusTagTxt.getBackground().setAlpha(26);

直觉告诉我这应该就是罪魁祸首,屏蔽掉该句代码后,问题果然消失:

于是查看该代码逻辑,Textview设置了一个背景色为#FF00000,该句代码将#FF00000的色值透明度设置为26,因此黑色变成了灰色。我自己的页面的背景色也刚好为#FF00000,因此就出现了问题:

问题原因:因为同一资源加载的实例都共享一个共用的状态,如果你更改一个实例的状态,其余的实例都会接收到相同的通知。因此在进入群组活动页面后,#FF00000的透明度被改变,app内其余地方用到该色值的背景色都出了问题。

知道了问题根因,解决方案自然就十分简单了:

getBackground().setAlpha(26);  -》 getBackground().mutate().setAlpha(26); 


简单翻译一下: 

使这个drawable变得状态不定。这个操作不能还原(变为不定后就不能变为原来的状态)。一个状态不定的drawable可以保证它不与其他任何一个drawabe共享它的状态。这对于你需要更改从同一资源加载来的drawable的属性时非常有用。默认情况下,所有的从同一资源(R.drawable.XXX)加载来的drawable实例都共享一个共用的状态,如果你更改一个实例的状态,其他所有的实例都会收到相同的通知。这个方法对于已经是mutable的drawable没有效果。

你可能感兴趣的:(慎用getBackgound.setAlpha改变资源透明度)