web-dev-qa-db-ja.com

Android-カスタム属性を持つカスタムUI

カスタムUI要素を(Viewまたは特定のUI要素拡張を使用して)作成できることは知っています。しかし、新しく作成されたUI要素に新しいプロパティまたは属性を定義することは可能ですか(継承されていませんが、デフォルトのプロパティまたは属性では処理できない特定の動作を定義するために真新しい)

例えばカスタム要素:

<com.tryout.myCustomElement
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:text="Element..."
   Android:myCustomValue=<someValue>
/>

MyCustomValueを定義することは可能ですか?

どうも

108
Waypoint

はい。短いガイド:

1.属性XMLを作成します

属性とそのタイプを使用して、/res/values/attrs.xml内に新しいXMLファイルを作成します

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyCustomElement">
        <attr name="distanceExample" format="dimension"/>
    </declare-styleable>
</resources>

基本的に、すべてのカスタム属性(ここでは1つのみ)を含むビューに対して1つの<declare-styleable />を設定する必要があります。可能なタイプの完全なリストを見つけたことがないので、ソースを調べて推測する必要があります。私が知っているタイプは参照(別のリソースへ)、色、ブール値、次元、浮動小数点数、整数、文字列です。彼らはかなり自明です

2.レイアウトで属性を使用する

例外は1つありますが、上記と同じように機能します。カスタム属性には、独自のXML名前空間が必要です。

<com.example.yourpackage.MyCustomElement
   xmlns:customNS="http://schemas.Android.com/apk/res/com.example.yourpackage"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:text="Element..."
   customNS:distanceExample="12dp"
   />

かなり簡単です。

3.渡された値を利用する

カスタムビューのコンストラクタを変更して、値を解析します。

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

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
    try {
        distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
    } finally {
        ta.recycle();
    }
    // ...
}

distanceExampleは、この例のプライベートメンバー変数です。 TypedArrayは、他のタイプの値を解析するために他にも多くのものを取得しました。

以上です。 Viewの解析された値を使用して変更します。 onDraw()で使用して、それに応じて外観を変更します。

252
user658042

Res/valuesフォルダーにattr.xmlを作成します。そこで属性を定義できます:

<declare-styleable name="">
    <attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

レイアウトファイルで使用する場合は、追加する必要があります

xmlns:customname="http://schemas.Android.com/apk/res/your.package.name"

customname:myCustomValue=""で値を使用できます

19
Maria Neumayer