Color Resources Must Be Resolved
I recently found some rather unfortunate code in an Android project I was working with:
private static final int MAIN_COLOR = R.color.main_color;
private static final int SECONDARY_COLOR = R.color.main_color | (0x05 << 24);
This is sucky code for two reasons. The first is that applying an alpha in this way is dubious at best. Why not use another color resource?
The second is that android color resources are not materialized in the resource array. That is the value of R.color.main_color from the resource file:
<resources>
<color name="main_color">#aabbcc"</a>
</resources>
is not in fact 0xAABBCC
but is in fact an arbitrary id number
picked by the resource compiler. To get the value you need to resolve
the id to a color using getContext()
.getResources() .getColor(R.color.main_color); Thus the above
SECONDARY_COLOR
may change arbitrarily as you add and remove
color resources and the compiler updates the ids. Even worse, if the
project is a library project, the id may change depending on which
application you are bundling the library with, as the resource
compiler has to have all ids unique within the entire application.
In conclusion, make your code suck less by not mistaking R.color.<anything> for an actual integer representation of the color.
Color resources must be resolved!