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


113

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

例:私のカスタム要素:

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

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

どうも



こんにちは、Androidのカスタム属性に関する素晴らしい記事があります-amcmobileware.org/android/blog/2016/09/11/custom-attributes
ArkadiuszCieślińskiNov

この関連する質問に対する私の答えを見てください。
Helios

回答:


258

はい。短いガイド:

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>

基本的<declare-styleable />に、すべてのカスタム属性(ここでは1つ)を含むビューに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()て変更します。たとえば、それを使用して外観を適宜変更します。


7
TypedArrayに注意してください。使い終わったら必ずrecycle()を呼び出してください。
zskalnik 2013年

ここでは良いリストを見つけることができますgithub.com/android/platform_frameworks_base/blob/master/core/...
ヤヒヤ

IDE(Eclipseなど)はカスタム属性のキー/値をオートコンプリートしますか?
AlikElzin-kilaka 2014

23
Gradleビルドではhttp://schemas.android.com/apk/res-auto、カスタム名前空間を宣言するときに使用する必要があります
Dori

2
手順3では、String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");attrがコンストラクターで渡されるAttributeSetであり、 'initialText'がカスタム属性名である場合に単純に使用できます
kosiara-Bartosz Kosarzycki

21

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=""


これは答えではありません。問題は、Javaからプログラムで変更する方法です
Fazal

-11

はい、できます<resource>。タグを使用するだけです。
このような:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

公式サイトからのリンク


ご回答ありがとうございます。しかし、リソースでは、デフォルトの「android:」値を使用しています。私のポイントは、カスタムUI要素のパラメーターとして、たとえばandroid:phoneNameSelected = "true"を持つことはできますか?
ウェイポイント2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.