22

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) {
}
Raymond Chenon
  • 8,990
  • 10
  • 64
  • 97

1 Answers1

65

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

slott
  • 3,106
  • 1
  • 32
  • 30
Martin Nordholts
  • 10,028
  • 2
  • 37
  • 42
  • 1
    What should we know about the order of attrsArray? – jophde Sep 05 '14 at 18:00
  • 2
    getDimensionPixelSize throws exception, using getLayoutDimension works fine – Kenumir Oct 27 '15 at 10:29
  • 1
    I've also seen using `R.styleable.Whatever` in a few places in place of the hardcoded array (then using `R.styleable.Whatever_blah` to get the `blah` property, instead of a hardcoded index); could you add that approach to this answer? – Fund Monica's Lawsuit Dec 26 '17 at 02:56