1. ホーム
  2. android

[解決済み] Android - カスタムUIとカスタムアトリビュート

2022-09-15 20:37:28

質問

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

例: 私のカスタム要素の要素。

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

では マイカスタムバリュー ?

Thx

どのように解決するのですか?

はい、簡単に説明します。

1. 属性XMLを作成する

の中に新しいXMLファイルを作成します。 /res/values/attrs.xml に、属性とその型

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

基本的には、1つの <declare-styleable /> を設定する必要があります。私は可能なタイプの完全なリストを見つけられなかったので、あなたは1つのソースを見る必要があると思います。私が知っているタイプは 参照(他のリソースへの)、色、ブーリアン、次元、浮動小数点数、整数、および文字列です。 . これらはかなり自明である

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() を使って、それに応じて外観を変更することができます。