web-dev-qa-db-ja.com

AttributeSetとは何ですか?

AndroidのAttributeSetとは何ですか?

カスタムビューに使用するにはどうすればよいですか?

71
Premier

他の人にとっては、詳細な説明ですが、遅い回答。

AttributeSet(Android Docs)

XMLドキュメント内のタグに関連付けられている属性のコレクション。

基本的に、カスタムビューを作成しようとしていて、寸法や色などの値を渡したい場合は、AttributeSetを使用して行うことができます。

ここに例があります

以下のようなViewを作成したいと想像してください

enter image description here

背景が黄色の長方形とその内側の円、たとえば5dpの半径、および緑の背景があります。次のように、ビューでXMLを介して背景色と半径の値を取得する場合:

<com.anjithsasindran.RectangleView
    app:radiusDimen="5dp"
    app:rectangleBackground="@color/yellow"
    app:circleBackground="@color/green" />

AttributeSetが使用される場所です。このファイルを持つことができますattrs.xml以下のプロパティを持つ、valuesフォルダー内。

<declare-styleable name="RectangleViewAttrs">
    <attr name="rectangle_background" format="color" />
    <attr name="circle_background" format="color" />
    <attr name="radius_dimen" format="dimension" />
</declare-styleable>

これはビューなので、JavaクラスはViewから拡張されます

public class RectangleView extends View {

    public RectangleView(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.RectangleViewAttrs);
        mRadiusHeight = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_radius_dimen, getDimensionInPixel(50));
        mCircleBackgroundColor = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_circle_background, getDimensionInPixel(20));
        mRectangleBackgroundColor = attributes.getColor(R.styleable.RectangleViewAttrs_rectangle_background, Color.BLACK);
        attributes.recycle()
    }
}

XmlレイアウトでRectangleViewにこれらのプロパティを使用できるようになり、RectangleViewコンストラクターでこれらの値を取得します。

app:radius_dimen
app:circle_background
app:rectangle_background
20
capt.swag

AttributeSetは、xmlリソースファイルで指定されたプロパティのセットです。カスタムビューで特別なことをする必要はありません。 View(Context context, AttributeSet attrs)は、レイアウトファイルからビューを初期化するために呼び出されます。このコンストラクタをカスタムビューに追加するだけです。 SDKの Custom View の例を確認して、使用されていることを確認してください。

6
Robby Pond

AttributeSetを使用して、xmlで定義するビューの追加のカスタム値を取得できます。例えば。 Defining Custom Attributes についてのチュートリアルがあり、「AttributeSetから値を直接読み取ることができます」と書かれていますが、実際にこれを行う方法は示されていません。ただし、styled属性を使用しない場合は警告が表示されます。

  • 属性値内のリソース参照は解決されません
  • スタイルは適用されません

スタイル設定された属性全体を無視して、属性を直接取得する場合:

example.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:custom="http://www.chooseanything.org">

  <com.example.CustomTextView
    Android:text="Blah blah blah"
    custom:myvalue="I like cheese"/>

</LinearLayout>

Xmlnsには2行(xmlns = XML名前空間)があり、2行目はxmlns:customとして定義されていることに注意してください。次に、その下にcustom:myvalueが定義されます。

CustomTextView.Java

public CustomTextView( Context context, AttributeSet attrs )
{
  super( context, attrs );
  String sMyValue = attrs.getAttributeValue( "http://www.chooseanything.org", "myvalue" );
  // Do something useful with sMyValue
}
6
Dave

ビューがXMLレイアウトから作成されると、XMLタグのすべての属性がリソースバンドルから読み取られ、AttributeSetとしてビューのコンストラクターに渡されます。

AttributeSetから直接値を読み取ることは可能ですが、そうすることにはいくつかの欠点があります。

  • 属性値内のリソース参照は解決されません
  • スタイルは適用されません

代わりに、AttributeSetobtainStyledAttribute() に渡します。このメソッドは、遅延およびスタイル設定されたTypedArray値の配列を返します。

0
Dennis