我创建了一个函数来获取任何给定主题的颜色。第一个功能按预期工作。
GetColorsForTheme
public static int[] GetColorsForTheme(Context context, int[] resourceIds, int[] defaults, int theme) {
int[] colors = new int[resourceIds.length];
int themeId = GetThemeIdForTheme(theme);
for (int i = 0; i < resourceIds.length; i++) {
TypedArray ta = context.obtainStyledAttributes(themeId, new int[]{resourceIds[i]});
int defColorId = defaults[i];
int defColor = ContextCompat.getColor(context, defColorId);
colors[i] = ta.getColor(0,defColor);
ta.recycle();
}
return colors;
}
如果我将obtainStyledAttributes
移出for
这样的循环:
public static int[] GetColorsForTheme(Context context, int[] resourceIds, int[] defaults, int theme) {
int[] colors = new int[resourceIds.length];
int themeId = GetThemeIdForTheme(theme);
TypedArray ta = context.obtainStyledAttributes(themeId, resourceIds);
for (int i = 0; i < resourceIds.length; i++) {
int defColorId = defaults[i];
int defColor = ContextCompat.getColor(context, defColorId);
colors[i] = ta.getColor(i,defColor);
}
ta.recycle();
return colors;
}
它返回错误的颜色。第一种颜色总是正确的,有时第二种和第三种颜色是正确的,其余颜色总是错误的。错误的颜色,我的意思是它们不是给定theme
中的颜色,但它们来自应用程序中当前选定的主题。我想知道如果我错过了一些非常明显的事情,或者是obtainStyledAttributes
要求颜色1到1的预期行为。
用法
int[] colors = MainApp.GetColorsForTheme(context,
new int[]{R.attr.colorPrimary,R.attr.customAttrColorBackgrounds,android.R.attr.textColorPrimary,R.attr.colorAccent},
new int[]{android.R.color.white,android.R.color.white,android.R.color.white,android.R.color.white},
position);