我正在构建一个拥有大量屏幕的应用。 大多数屏幕顶部都有一个背景颜色的视图。
我经常使用view.setBackgroundColor(color)
更改颜色出现了奇怪的事情:有时在设置一个视图的颜色后,对#f14fb7说,当在应用程序中导航时,其他视图的背景设置为该颜色而我不想要它们。 它有时甚至发生在我没有为其设置id的视图中,因此在这些视图上无法调用setBackgroundColor。
这很少发生,并且不符合我试过的任何流程。
当我杀死应用程序并重新启动它时,一切正常。
我唯一的猜测是内存泄漏之王,但我希望有一个更简单的解释。
任何人都可以想到发生这种情况的原因吗?
*它发生在我的Galaxy S3上。
答案 0 :(得分:13)
没有代码就不容易......但我猜你在多个视图上重用相同的ColorDrawable
,如果你看一下View.setBackgroundColor()
源代码:
public void setBackgroundColor(int color) {
if (mBGDrawable instanceof ColorDrawable) {
((ColorDrawable) mBGDrawable).setColor(color);
} else {
setBackgroundDrawable(new ColorDrawable(color));
}
}
您可以看到它会更改ColorDrawable
的颜色,而不是每次都创建一个新颜色。我很确定这就是你有这种奇怪行为的原因。
修改强>
当您使用android:background
在xml中设置初始背景颜色时,您正在执行此操作(根据android doc):
将背景设置为给定资源。资源应该引用Drawable对象
根据我的理解,它会在膨胀期间设置字段View.mBGDrawable
。我建议您使用View.setBackgoundDrawable(new ColorDrawable(the_color_int_code)))
代替setBackgroung(the_color_int_code)
。它应该解决你的问题。
答案 1 :(得分:5)
如果您的视图的颜色在xml ex:
中设置,通常会发生这种情况android:background="@color/cyan"
现在,我们在内部创建了一个新的ColorDrawable
- 让我们在该视图的类中调用它conceptual_drawable_cyan
。现在,使用以下命令以编程方式为同一视图指定不同的颜色:
view.setBackgroundColor(newColor);
在此视图内部,而不是创建不同的drawable,它将此newColor
设置为drawable_cyan
。因此,从这一点开始,如果你在任何地方使用
android:background="@color/cyan"
视图实际上会将conceptual_drawable_cyan
与newColor
一起使用。
解决方案:
不使用setBackgroundColor
以编程方式设置颜色,而是使用:
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setBackground(new ColorDrawable(newColor));
} else {
view.setBackgroundDrawable(new ColorDrawable(newColor));
}
答案 2 :(得分:1)
在“values”文件夹下创建“colors.xml”文件。例如:
<?xml version="1.0" encoding="utf-8"?>
<resources><color name="pink">#f14fb7</color></resources>
使用view.setBackgroundResource(R.color.pink);