以编程方式获取强调色(来自模块)

时间:2015-09-28 09:21:30

标签: android android-custom-view android-theme android-library

我已经制作了一个自定义工具栏,但是由于我在模块上移动了源代码,因此我遇到了一些问题:

首先:我无法检索强调色因为它引发了这次崩溃:

Caused by: java.lang.NoClassDefFoundError: com.kassisdion.lib.R$attr

(这是我尝试检索重音色的方式)

private static int getThemeAccentColor1(final Context context) {
    TypedValue typedValue = new TypedValue();

    TypedArray a = context.obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorAccent});
    int color = a.getColor(0, 0);
    a.recycle();

    return color;
}

public static int getThemeAccentColor2(final Context context) {
    final TypedValue value = new TypedValue();
    context.getTheme().resolveAttribute(R.attr.colorAccent, value, true);
    return value.data;
}

其次:我无法再访问 android.support.v7.appcompat.R.attr.toolbarStyle 值(在我用它静态访问之前)。

我认为这两个问题有关,但我不知道出了什么问题。

更新:

我曾经覆盖了很多Widget而且我使用了这个构造函数:

public MyWidget(Context context, AttributeSet attrs) {
    this(context, attrs, android.support.v7.appcompat.R.attr.myWidgetStyle);
}

通常人们会将android.support.v7.appcompat.R.attr.myWidgetStyle替换为0,但这可能会导致一些问题(例如EditText变得不可编辑)。

经过大量研究后,我发现android.support.v7.appcompat.R.styleable.*无法使用。 (在最后一次更新时,他们将这个字段设为私有,也许它与我的问题有关。)

所以我的解决方案是创建自己的工具栏,而不是扩展android.support.v7.widget.Toolbar

1 个答案:

答案 0 :(得分:2)

从主题中获取颜色:

@ColorInt
public static int getThemeColor
(
        @NonNull final Context context,
        @AttrRes final int attributeColor
)
{
    final TypedValue value = new TypedValue();
    context.getTheme ().resolveAttribute (attributeColor, value, true);
    return value.data;
}

例如,要获得强调色(来自片段):

final int color = UtilsColor.getThemeColor(getActivity(), R.attr.colorAccent);