web-dev-qa-db-fra.com

comment obtenir les propriétés AttributeSet

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) {
}
21
Raymond Chenon

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

63
Martin Nordholts