我将代码分成两个项目,以拥有某种SDK,该SDK具有我以后所有项目所共有的功能。

因此,我遇到了从另一个项目检索一个项目的XML文件中的值的问题。例如,我必须在styles.xml中检索一种自定义颜色(我在attrs.xml中定义,名为“ iconColor”)。这是我所做的:

TypedValue typedValue = new TypedValue();
Resources.Theme theme = context.getTheme();
int colorIdentifier = context.getResources().getIdentifier("iconColor", "attr", context.getPackageName());
if (theme.resolveAttribute(colorIdentifier, typedValue, true)) {
    return typedValue.data;
}
else {
    return 0;
}


从一个项目到另一个项目都运行良好。现在,出于另一个目的,我想检索上下文主题的colorPrimary。我将代码调整为具有通用功能,现在是这样:

/**
 * Retrieves a resource from context's theme using the resource id
 *
 * @param resId the resource id, ie. android.R.attr.colorPrimary
 * @return the resource value, or null if not found
 */
public @Nullable Integer getResourceFromTheme(int resId) {
    Integer result = null;

    TypedValue typedValue = new TypedValue();
    Resources.Theme theme = context.getTheme();
    if (theme.resolveAttribute(resId, typedValue, true)) {
        result = typedValue.data;
    }

    return result;
}

/**
 * Retrieves a resource from context's theme using the resource name
 *
 * @param resName the resource name, ie. "colorPrimary"
 * @return the resource value, or null if not found
 */
public @Nullable Integer getResourceFromTheme(@NonNull String resName) {
    int resId = context.getResources().getIdentifier(resName, "attr", context.getPackageName());
    return getResourceFromTheme(resId);
}


因此,从理论上讲,我可以使用android.R检索自定义属性和本机属性。但是,如果我的costom iconColor属性仍然可以使用,则无法检索colorPrimary,它返回的数据不正确。即使很奇怪,当我尝试使用一种方法或另一种方法时,我也得到了不同的值,这意味着我弄错了代码:

android - Android通过编程从上下文主题获取资源(无需直接访问“R”)-LMLPHP

最佳答案

好的,函数正常工作,但是我犯了两个错误,xxxx是ColorRes,而aaa / bbbb是ColorInt,我用android.R.attr.colorPrimary而不是R.attr.colorPrimary调用了函数。

09-25 21:43