【Android】数カ所で同じDrawableを使ってハマった

複数箇所で同じDrawableリソースをContextCompat#getDrawable()等で使うと、他の箇所でカラーフィルターとかかけた時に全ての箇所に反映されてしまってハマったのでメモ

val hogeDrawable = ContextCompat.getDrawable(context, R.drawable.ic_sample)
val piyoDrawable = ContextCompat.getDrawable(context, R.drawable.ic_sample)

// piyoDrawableだけに赤いフィルターをかける
piyoDrawable.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN)

val hogeImageView = ImageView(context)
hogeImageView.setImageDrawable(hogeDrawable)

val piyoImageView = ImageView(context)
piyoImageView.setImageDrawable(piyoDrawable)

こんな感じに書くとhogeDrawableは元の色、piyoDrawableは赤く表示されると思いきやどちらも赤くなってしまいます。
この後にhogeDrawableにsetColorFilter()をかけるとpiyoDrawableのカラーフィルターも上書きされてしまいます。

Drawableのインスタンスを得る時に次の様にすることで同じリソースを使っている他の箇所に影響を与えなくなるようです。

val hogeDrawable = ContextCompat.getDrawable(context, R.drawable.ic_sample)
		.constantState.newDrawable().mutate()
val piyoDrawable = ContextCompat.getDrawable(context, R.drawable.ic_sample)
		.constantState.newDrawable().mutate()
スポンサーリンク

フォローする