如何访问多种格式的自定义属性?

时间:2015-01-27 20:11:29

标签: android attributes custom-view

我在另一个答案中读到,在android中,您可以为自定义视图声明具有多种格式的属性,如下所示:

<attr name="textColor" format="reference|color"/>

如何在班级中访问这些属性?我应该假设它是一个参考,使用getResources().getColorStateList()然后假设它是一个原始的RGB / ARGB颜色,如果Resources.getColorStateList()抛出Resources.NotFoundException或是否有更好的区分方式格式/类型?

2 个答案:

答案 0 :(得分:2)

它应该是这样的:

变体1

public MyCustomView(Context context,
                    AttributeSet attrs,
                    int defStyleAttr,
                    int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    TypedArray typed = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyleAttr, defStyleRes);
    int resId = typed.getResourceId(R.styleable.MyCustomView_custom_attr, R.drawable.default_resourceId_could_be_color);
    Drawable drawable = getMultiColourAttr(getContext(), typed, R.styleable.MyCustomView_custom_attr, resId);
    // ...
    Button mView = new Button(getContext());
    mView.setBackground(drawable);

}

protected static Drawable getMultiColourAttr(@NonNull Context context,
                                             @NonNull TypedArray typed,
                                             int index,
                                             int resId) {
    TypedValue colorValue = new TypedValue();
    typed.getValue(index, colorValue);

    if (colorValue.type == TypedValue.TYPE_REFERENCE) {
        return ContextCompat.getDrawable(context, resId);
    } else {
        // It must be a single color
        return new ColorDrawable(colorValue.data);
    }
}

当然getMultiColourAttr()方法可能不是静态的而且不受保护,这取决于项目。

这个想法是为这个特定的自定义属性获取一些resourceId,并且仅在资源不是颜色但使用TypedValue.TYPE_REFERENCE时使用它,这应该意味着要获得Drawable。一旦你得到一些Drawable应该很容易使用它像背景,例如:

mView.setBackground(绘制);

变体2

查看变体1您可以使用相同的 resId ,但只需将其传递给View方法setBackgroundResource(resId),该方法将只显示此资源背后的任何内容 - 可以是可绘制的或颜色。 / p>

我希望它会有所帮助。感谢

答案 1 :(得分:0)

在/res/attrs.xml中:

<declare-styleable name="YourTheme">
    <attr name="textColor" format="reference|color"/>
</declare-styleable>

在自定义视图构造函数中,尝试类似的东西(我没有运行它):

int defaultColor = 0xFFFFFF; // It may be anyone you want.
TypedArray attr = getTypedArray(context, attributeSet, R.styleable.YourTheme);
int textColor = attr.getColor(R.styleable.YourTheme_textColor, defaultColor);