2013-02-14 4 views
15

많은 스크린이있는 앱을 만들고 있습니다. 대부분의 화면에는 배경색이있는 상단의보기가 있습니다. 때로는 하나의 뷰의 색상을 설정 한 후, # f14fb7, 응용 프로그램에서 탐색, 다른 뷰 '배경에 말 :Android 백그라운드가 예기치 않게 변경됩니다.

나는 종종

가 여기에 이상한 일을 제공 view.setBackgroundColor (컬러)를 사용하여 해당 색상을 변경 내가 원하지 않으면 그 색깔로 설정되어 있습니다. ID를 설정하지 않은보기가 때때로 발생하기도하므로 해당보기에서 setBackgroundColor가 호출되는 방법이 없습니다.

이것은 거의 발생하지 않으며 내가 시도한 모든 흐름과 일치하지 않습니다.

내가 앱을 죽이고 다시 시작하면 모든 것이 정상적으로 작동합니다.

내 유일한 추측은 메모리 누출의 왕이다.하지만 더 간단한 설명이 있기를 바랍니다.

누구나 이런 일이 일어날 수있는 이유가 있을까요?

* 내 갤럭시 S3에서 발생합니다.

+2

우리는 당신이 당신의 화면과 상단에있는 뷰를 배치하는 방법을 정확히 이해하는 몇 가지 코드를 참조 할 필요가있다. –

+0

글쎄, 당신은 색깔이 가장 바깥쪽에 가장 가까운 배경을 가지고있을 것입니다. 그런 다음 배경이 투명하거나 무언가있는 다른 레이아웃이 있습니까? – Nezam

+0

앱 전체에서 발생하므로 게시 할 코드가 없습니다. Nezam, 그게 아무것도 아닙니다 ...이 문제가 발생하지 않는 시간은 95 %입니다. 하지만 배경을 설정하는 코드는 view.setBackgroundColor (color) ... 아무것도 아닙니다. 이상한 점은 특정 화면과 관련이없는 다른 화면에 영향을 미친다는 것입니다 ... 그것이 내가 메모리 누수가 의심되는 이유입니다. – dors

답변

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 객체를 참조해야합니다.

내 이해에 따르면이 필드는 inflate 중에 View.mBGDrawable으로 설정됩니다. setBackgroung(the_color_int_code) 대신 View.setBackgoundDrawable(new ColorDrawable(the_color_int_code)))을 사용하는 것이 좋습니다. 문제를 해결해야합니다.

+0

왜 여러 ColorDrawable을 여러보기에서 사용한다고 생각합니까? 소스 코드에서 알 수 있듯이, 필요한 것은 color (int)를 전달하는 것이고, View 클래스는 필요한 경우 새로운 ColorDrawable 인스턴스를 생성했습니다. 더 나아가,이 스트 레지 동작이 발생할 때 뷰 색상을 디버깅하면 실제로 다른 색상이 표시 될 때 올바른 색상 세트가있는 것처럼 보입니다. – dors

+0

의 유효성을 검사할지 여부를 제안합니다. 디버깅 할 때 'mBGDrawable'참조가 2 개의 뷰에 잘못 표시되어 동일한 배경으로 표시됩니다. 이것이 동일한 참조라면 제 제안이 옳습니다. – ben75

+0

그리고 네 말이 맞다면 어떻게 해결할 수 있니? 새로운 ColorDrawable 인스턴스를 만드는 것이 아니라 View 클래스가 수행합니다. – dors

1

"values"폴더 아래에 "colors.xml"파일을 만듭니다. 예 :

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

사용하면 그 색상의 XML 예에 설정되어있는보기있는 경우에 일반적으로 발생 view.setBackgroundResource(R.color.pink);

5

:

android:background="@color/cyan" 

지금이 내부적으로 생성하는이 ColorDrawable 새 - conceptual_drawable_cyan를 호출 할 수 있습니다를 그보기의 클래스 내부.동일한 뷰를 사용하여 프로그래밍 다른 색 할당 지금 때 다른 그리기 만드는 대신 내부적

view.setBackgroundColor(newColor); 

이보기는 drawable_cyannewColor를 설정한다. 따라서이 시점에서 이후 어디서든

android:background="@color/cyan" 

를 사용하는 경우도 실제로 newColorconceptual_drawable_cyan을 사용합니다.

솔루션 대신 프로그램 색상을 설정 setBackgroundColor를 사용

, 사용 :

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
     view.setBackground(new ColorDrawable(newColor)); 
    } else { 
     view.setBackgroundDrawable(new ColorDrawable(newColor)); 
    } 
관련 문제