2013-02-14 65 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)); 
    }