동일한 이미지 리소스 (예: R.drawable.samplebitmap)를 여러곳에서 사용하고 해당 Drawable의 속성을 바꾸면 다른 곳에서도 같이 변경됨.


예를 들어 ActionBar의 배경색에 사용될 Drawable을 메인화면에서는 원본 그대로 사용하고, 상세 페이지에서는 스크롤 상태에 따라 투명도를 적용했는데, 투명도 적용 후 메인화면으로 돌아가면 똑같이 투명도가 변경되는 이슈 발생.

(같은 R.drawable.samplebitmap리소스에 대해서 각각 get해서 사용한 상태)


Android에서 동일한 리소스에 대해서 메모리 낭비를 방지하기 위헤 Constant state를 공유하고 이로 인해서 변경 사항이 모든 Drawable에 영향을 끼치고 있음.


해결 방법으로는 Drawable의 mutate()메소드를 호출해서 얻어진 Drawable로 원하는 작업 수행.


문제가 발생하는 경우에 대한 예제 코드로 하기 코드를 Adapter의 getView() 메소드와 같이 반복적으로 사용하는 경우 star.setAlpha() 수행 결과가 book.isFavorite()의 결과와 상관 없이 일괄 적용됨.


Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
  star.setAlpha(255); // opaque
} else {
  star.setAlpha(70); // translucent
}


문제를 해결하는 예제 코드

Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
  star.mutate().setAlpha(255); // opaque
} else {
  star. mutate().setAlpha(70); // translucent
}
참고자료: http://android-developers.blogspot.kr/2009/05/drawable-mutations.html


Posted by Gungume
,