18

我正在构建一个有很多屏幕的应用程序。大多数屏幕的顶部都有一个带有背景颜色的视图。

我经常使用 view.setBackgroundColor(color) 更改该颜色

奇怪的事情来了:有时在设置了一个视图的颜色后,例如 #f14fb7 ,当在应用程序中导航时,其他视图的背景设置为该颜色,而我并不希望它们这样做。有时甚至会发生在我没有为其设置 id 的视图上,因此无法在这些视图上调用 setBackgroundColor。

这种情况很少发生,并且与我尝试过的任何流程都不一致。

当我终止应用程序并重新启动它时,一切正常。

我唯一的猜测是一些内存泄漏之王,但我希望有一个更简单的解释。

谁能想到发生这种情况的某种原因?

*它发生在我的 Galaxy S3 上。

4

3 回答 3

15

没有代码,这并不容易......但我想你ColorDrawable在多个视图上重用相同的,如果你看看View.setBackgroundColor()源代码:

public void setBackgroundColor(int color) {
    if (mBGDrawable instanceof ColorDrawable) {
        ((ColorDrawable) mBGDrawable).setColor(color);
    } else {
        setBackgroundDrawable(new ColorDrawable(color));
    }
}

你可以看到它改变了的颜色ColorDrawable并且每次都没有创建一个新的。我很确定这就是你有这种奇怪行为的原因。

编辑

当您在 xml 中设置初始背景颜色时,android:background您正在执行此操作(根据android doc):

将背景设置为给定资源。资源应该引用 Drawable 对象

据我了解,它将View.mBGDrawable在膨胀期间设置字段。我建议你使用View.setBackgoundDrawable(new ColorDrawable(the_color_int_code)))而不是setBackgroung(the_color_int_code). 它应该可以解决您的问题。

于 2013-02-14T12:46:16.600 回答
6

如果您有一个在 xml ex 中设置颜色的视图,通常会发生这种情况:

android:background="@color/cyan" 

现在这在内部创建了一个新的ColorDrawable- 让我们conceptual_drawable_cyan在该视图的类中调用它。现在,当以编程方式为同一视图分配不同的颜色时,使用:

view.setBackgroundColor(newColor);

在内部这个视图,而不是创建一个不同的drawable,它把它设置newColordrawable_cyan. 因此,从这一点开始,如果您在任何地方使用

android:background="@color/cyan" 

该视图实际上将使用conceptual_drawable_cyanwith 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));
    }
于 2015-05-26T10:25:44.157 回答
1

在“values”文件夹下创建“colors.xml”文件。例子:

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="pink">#f14fb7</color></resources>

利用view.setBackgroundResource(R.color.pink);

于 2013-09-07T21:16:23.743 回答