使用obtainStyledAttributes的奇怪行为

时间:2018-06-03 15:55:07

标签: android android-theme android-styles

我创建了一个函数来获取任何给定主题的颜色。第一个功能按预期工作。

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);

0 个答案:

没有答案