What is AttributeSet in Android?
How can i use it for my custom view?
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 .
public interface AttributeSet. A collection of unique attributes. This is a read-only, immutable interface. An attribute is basically a key and a value assigned to the key. The collection may represent something like a style run, a logical style, etc.
defStyleAttr is a theme attribute that's defined by the view. It allows us to specify a style resource in our theme that will be applied to this view. If defStyleAttr is 0 or there's no value for the attribute in our theme, then defStyleRes is used.
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
.
Imagine you want to create a View
like below
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
You can use AttributeSet to get extra, custom values for your view which you define in the xml. For example. There's a tutorial about Defining Custom Attributes which states, "it's possible to read values from the AttributeSet directly" but it doesn't say how to actually do this. It does warn, however, that if you don't use styled attributes then:
If you want to ignore the whole styled attributes thing and just get the attributes directly:
example.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://www.chooseanything.org"> <com.example.CustomTextView android:text="Blah blah blah" custom:myvalue="I like cheese"/> </LinearLayout>
Note there are two lines of xmlns (xmlns = XML namespace), the second is defined as xmlns:custom. Then below that custom:myvalue is defined.
CustomTextView.java
public CustomTextView( Context context, AttributeSet attrs ) { super( context, attrs ); String sMyValue = attrs.getAttributeValue( "http://www.chooseanything.org", "myvalue" ); // Do something useful with sMyValue }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With