2016-11-09 45 views
0
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear); 
int color = ContextCompat.getColor(getContext(), mColorResourceId); 
linearLayout.setBackgroundColor(color); 

我有這行代碼: mColorResourceId它的持有R.color.category_numbers - >mColorResourceId = R.color.category_numbers解釋從ContextCompat類使用getColor()方法的主要原因?

當我通過mColorResourceId直接setBackgroundColor(mColorResourceId);是,儘管該方法不改變顏色接受int值。

我的問題爲什麼我需要這個額外的步驟int color = ContextCompat.getColor(getContext(), mColorResourceId);來改變顏色?

+0

雖然您碰巧想要設置資源的顏色,但其他開發人員可能希望用Java對顏色進行硬編碼,或從文件/數據庫加載顏色,或者將顏色作爲Web服務響應的一部分,或隨機選擇一種顏色。因此,'setBackgroundColor()'採用* color *,而不僅僅是一種顏色的資源ID。 – CommonsWare

回答

3

setBackgroundColor()方法接受int,該值應該是aarrggbb格式的顏色值。資源ID R.color.category_numbers也是int,但它不是一個顏色值;相反,它是color資源的標識符。調用ContextCompat.getColor(getContext(), mColorResourceId)將檢索對應於mColorResourceId的實際顏色值。

Android的這種間接原因的部分原因是爲了提供靈活性。返回的實際顏色可能取決於當前主題或設備配置,實際可能會在運行時更改(取決於您聲明顏色資源的方式)。

+0

爲什麼我用mColorResourceId傳遞getContext()?爲什麼我需要? –

+0

@ AndroidAL-Khatib - 這是爲了讓檢索的顏色對當前主題敏感。例如,假設您將顏色資源定義爲'?attr/some_theme_color_name',其中您定義了自己的主題屬性'some_theme_color_name'。然後,使用Android Marshmallow和以後,'ContextCompat.getColor()'將使用傳遞的上下文的主題集來查找顏色。 –

+0

非常感謝(((: –

相關問題