Подтвердить что ты не робот

Как получить свойства AttributeSet

Предположим, что у меня есть класс, который расширяет ViewGroup

public class MapView extends ViewGroup

Он включен в макет map_controls.xml, как этот

<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>

Как получить свойства в конструкторе из AttributeSet? Пусть говорят, что это можно сделать в фоновом поле.

public MapView(Context context, AttributeSet attrs) {
}
4b9b3361

Ответ 1

В общем случае вы делаете так:

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();
}

Обратите внимание на значение индексов элементов в attrsArray. Однако, в вашем конкретном случае, использование геттеров работает так же хорошо, как вы обнаружили сами:

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();
}

Это работает, потому что атрибут, который вы имеете в com.xxx.map.MapView является базовыми атрибутами, которые базовый класс View анализирует в своем конструкторе. Если вы хотите определить свои собственные атрибуты, взгляните на этот вопрос и отличный ответ: Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML