how to get AttributeSet properties

43,799

In the general case, you do like this:

public MapView(Context context, AttributeSet attrs) {
    // ...

    int[] attrsArray = new int[] {
        android.R.attr.id, // 0
        android.R.attr.background, // 1
        android.R.attr.layout_width, // 2
        android.R.attr.layout_height // 3
    };
    TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray);
    int id = ta.getResourceId(0 /* index of attribute in attrsArray */, View.NO_ID);
    Drawable background = ta.getDrawable(1);
    int layout_width = ta. getLayoutDimension(2, ViewGroup.LayoutParams.MATCH_PARENT);
    int layout_height = ta. getLayoutDimension(3, ViewGroup.LayoutParams.MATCH_PARENT);
    ta.recycle();
}

Pay attention to how the indexes of the elements in in attrsArray matter. However, in your particular case, it works just as good to use the getters, like you discovered yourself:

public MapView(Context context, AttributeSet attrs) {
    super(context, attrs); // After this, use normal getters

    int id = this.getId();
    Drawable background = this.getBackground();
    ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
}

This works because the attribute you have on com.xxx.map.MapView are basic attributes that the View base class parses in its constructor. If you want to define your own attributes, take a look at this question and the excellent answer: Declaring a custom android UI element using XML

Share:
43,799
Raymond Chenon
Author by

Raymond Chenon

This is me with Joel Spolsky in Berlin. http://betterapps.io/ portfolio http://www.linkedin.com/in/raychenon https://blog.raychenon.com https://github.com/raychenon

Updated on July 15, 2022

Comments

  • Raymond Chenon
    Raymond Chenon almost 2 years

    Suppose i have a class which extends ViewGroup

    public class MapView extends ViewGroup
    

    It is included in the layout map_controls.xml like this

    <com.xxx.map.MapView
        android:id="@+id/map"
        android:background="@drawable/address"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </com.xxx.map.MapView>
    

    How do i retrieve properties in the constructor from AttributeSet ? Let's say the drawable in the background field.

    public MapView(Context context, AttributeSet attrs) {
    }