今天在做银行卡列表的时候打算用CardView的实现,然后不同的银行卡显示不同背景色,本来打算用取色器去拾取不同的银行卡图标的亮色调,但是为了简单我就自己在colors.xml弄了四个颜色,然后将期放到数组里,通多随机数做下标取出。但是问题来了,每次都显示一种颜色,而且还不在我设置的颜色之内,我就很纳闷。所以我就大概跟了一下源码,大概明白是怎么回事了。
一直不变的效果如下:
我的错误代码如下:
int[] bg_colors={R.color.bank_card_1,R.color.bank_card_2,R.color.bank_card_3,R.color.bank_card_4};
holder.card_view.setCardBackgroundColor(bg_colors[mRandom.nextInt(mLength)]);
这个灰色在源码中对应的是一个颜色十六进制:
public static final int cardview_dark_background = 0x7f0c001f;
其实这里是维护了一个默认值,根据不同的主题取不同的值:
看完这个图我就知道我写错了,正确的写法应该是这样的:
int[] bg_colors={R.color.bank_card_1,R.color.bank_card_2,R.color.bank_card_3,R.color.bank_card_4};
int color = ContextCompat.getColor(context, bg_colors[mRandom.nextInt(mLength)]);
holder.card_view.setCardBackgroundColor(color);
刚开始我传的就是id编号,并不是一个色值,所以才会做默认处理。去跟getColor你可以知道颜色和主题是进行绑定的:
@Nullable
public final int getColor(int id) {
return getResources().getColor(id, getTheme());
}
这里确实是我的写法有误,但是我也明白很多,最终结果就是这样的: