Android View背景意外更改

时间:2013-02-14 12:30:10

标签: android view colors setbackground

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

我经常使用view.setBackgroundColor(color)

更改颜色

出现了奇怪的事情:有时在设置一个视图的颜色后,对#f14fb7说,当在应用程序中导航时,其他视图的背景设置为该颜色而我不想要它们。 它有时甚至发生在我没有为其设置id的视图中,因此在这些视图上无法调用setBackgroundColor。

这很少发生,并且不符合我试过的任何流程。

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

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

任何人都可以想到发生这种情况的原因吗?

*它发生在我的Galaxy S3上。

3 个答案:

答案 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_cyannewColor一起使用。

解决方案:

不使用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);