如何获得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的构造函数中检索属性? 让我们说背景字段中的drawable。

 public MapView(Context context, AttributeSet attrs) { } 

Solutions Collecting From Web of "如何获得AttributeSet属性"

在一般情况下,你这样做:

 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.getDimensionPixelSize(2, ViewGroup.LayoutParams.MATCH_PARENT); int layout_height = ta.getDimensionPixelSize(3, ViewGroup.LayoutParams.MATCH_PARENT); ta.recycle(); } 

注意attrs中元素的索引如何重要。 然而,就你的具体情况而言,使用获得者就像你发现自己一样好:

 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基类在其构造函数中parsing的基本属性。 如果你想定义你自己的属性,看看这个问题和优秀的答案: 使用XML声明一个自定义的Android UI元素