2013-02-14 56 views
15

我正在构建一个拥有大量屏幕的应用程序。 大部分屏幕都有一个背景颜色的顶部视图。Android查看背景意外变化

我经常改变使用view.setBackgroundColor(彩色)

这里来的奇怪的事情是颜色:有时设置一个视图的颜色之后,说#f14fb7,在应用程序导航时,其他若干意见的背景被设置为那种颜色,我不想让他们。 它有时甚至发生在我没有设置id的视图中,所以没有办法在这些视图上调用setBackgroundColor。

这种情况很少发生,与我试过的任何流量都不相符。

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

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

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

*发生在我的Galaxy S3上。

+2

我们需要看到一些代码来了解你究竟是如何布置您的屏幕,并在上面的意见。 – 2013-02-14 12:37:38

+0

嗯可能是你有最外面的背景颜色,然后你有其他布局背景透明或什么? – Nezam 2013-02-14 12:41:24

+0

我没有要发布的代码,因为这发生在整个应用程序。 Nezam,这不是那样的... 95%的时间没有发生这个问题。 但设置背景的代码是view.setBackgroundColor(color)...没什么特别的。 奇怪的是,它会影响与该特定屏幕无关的其他屏幕......这就是为什么我怀疑它是内存泄漏 – dors 2013-02-14 12:51:16

回答

13

没有它不容易的代码...但我猜你是重用在多个视图相同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):

将背景设置为给定的资源。资源应该指可绘制对象

根据我的理解,它将在充气期间设置字段View.mBGDrawable。我建议你使用View.setBackgoundDrawable(new ColorDrawable(the_color_int_code)))而不是setBackgroung(the_color_int_code)。它应该解决你的问题。

+0

为什么你认为我在多个视图上使用相同的ColorDrawable? 正如您在源代码中看到的,我所做的只是传递一个颜色(int),并且如果需要,View类创建了一个新的ColorDrawable实例。 此外,当发生这种情况时,如果我调试视图颜色,看起来它具有正确的颜色集,但实际上显示的是不同的颜色。 – dors 2013-02-14 17:16:31

+0

来验证或不是我的建议:在调试时注意错误地显示相同背景的2个视图的'mBGDrawable'的引用。如果这是相同的参考,我的建议是正确的。 – ben75 2013-02-14 20:18:28

+0

如果你是对的,我该如何解决这个问题?我不是创建一个新的ColorDrawable实例,View类可以这么做吗 – dors 2013-02-15 06:26:20

1

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

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

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

5

,如果您有其颜色被设置在XML前视图这通常发生:

android:background="@color/cyan" 

现在,这在内部创建一个新的ColorDrawable - 让叫它conceptual_drawable_cyan在该视图的课堂内。现在,当同样的观点被赋予不同的颜色以编程方式使用:而不是创建一个不同的绘制的

view.setBackgroundColor(newColor); 

内部这个视图设置此newColordrawable_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)); 
    }