What is AttributeSet and how can i use it?

Premier picture Premier · Mar 15, 2011 · Viewed 50.3k times · Source

What is AttributeSet in Android?

How can i use it for my custom view?

Answer

capt.swag picture capt.swag · Mar 31, 2016

A late answer, although a detailed description, for others.

AttributeSet (Android Docs)

A collection of attributes, as found associated with a tag in an XML document.

Basically if you are trying to create a custom view, and you want to pass in values like dimensions, colors etc, you can do so with AttributeSet.

Here's an example

Imagine you want to create a View like below

enter image description here

There's a rectangle with yellow background, and a circle inside it, with let's say 5dp radius, and green background. If you want your Views to take the values of background colors and radius through XML, like this:

<com.anjithsasindran.RectangleView
    app:radiusDimen="5dp"
    app:rectangleBackground="@color/yellow"
    app:circleBackground="@color/green" />

Well that's where AttributeSet is used. You can have this file attrs.xml in values folder, with the following properties.

<declare-styleable name="RectangleViewAttrs">
    <attr name="rectangle_background" format="color" />
    <attr name="circle_background" format="color" />
    <attr name="radius_dimen" format="dimension" />
</declare-styleable>

Since this is a View, the java class extends from View

public class RectangleView extends View {

    public RectangleView(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.RectangleViewAttrs);
        mRadiusHeight = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_radius_dimen, getDimensionInPixel(50));
        mCircleBackgroundColor = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_circle_background, getDimensionInPixel(20));
        mRectangleBackgroundColor = attributes.getColor(R.styleable.RectangleViewAttrs_rectangle_background, Color.BLACK);
        attributes.recycle()
    }
}

So now we can use, these properties to our RectangleView in your xml layout, and we will obtain these values in the RectangleView constructor.

app:radius_dimen
app:circle_background
app:rectangle_background