Supposons que j'ai une classe qui étend ViewGroup
public class MapView extends ViewGroup
Il est inclus dans la mise en page map_controls.xml
comme ça
<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>
Comment récupérer des propriétés dans le constructeur depuis AttributeSet? Disons le dessinable dans le champ d'arrière-plan.
public MapView(Context context, AttributeSet attrs) {
}
Dans le cas général, vous aimez ceci:
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();
}
Faites attention à la façon dont les index des éléments dans attrsArray comptent. Cependant, dans votre cas particulier, cela fonctionne tout aussi bien d'utiliser les getters, comme vous l'avez découvert vous-même:
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();
}
Cela fonctionne car l'attribut que vous avez sur com.xxx.map.MapView
sont des attributs de base que la classe de base View
analyse dans son constructeur. Si vous souhaitez définir vos propres attributs , jetez un œil à cette question et à l'excellente réponse: Déclarer un Android Élément d'interface utilisateur utilisant XML