web-dev-qa-db-ja.com

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

一般的なケースでは、次のようにします。

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基本クラスがコンストラクターで解析する基本属性であるためです。 own属性を定義する場合は、この質問と優れた答えを見てください: カスタムの宣言Android XMLを使用したUI要素

63