8

スタイリング可能な属性を使用して新しいビューを作成しているとします。私はそれらをこのように宣言します(これはドキュメントがそれを行うように言っている方法です

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="TriangleView">
        <attr name="direction">
            <enum name="NE" value="0" />
            <enum name="NW" value="1" />
            <enum name="SW" value="2" />
            <enum name="SE" value="3" />
        </attr>
    </declare-styleable>

    <declare-styleable name="BannerView">
        <attr name="direction">
            <enum name="NE" value="0" />
            <enum name="NW" value="1" />
            <enum name="SW" value="2" />
            <enum name="SE" value="3" />
        </attr>
        <attr name="thickness" format="dimension" />
    </declare-styleable>
</resources>

ただし、すべての属性が明らかに同じ名前空間にあるため、これは機能せず、エラーが発生しますError: Attribute "direction" has already been defined

したがって、明らかに重複している属性を次の<declare-styleable>ように外部に移動する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<resources>


    <attr name="direction">
        <enum name="NE" value="0" />
        <enum name="NW" value="1" />
        <enum name="SW" value="2" />
        <enum name="SE" value="3" />
    </attr>

    <declare-styleable name="BannerView">
        <attr name="thickness" format="dimension" />
    </declare-styleable>
</resources>

しかし、これには2つの疑問があります。

  1. これが機能する場合、正確には何のポイント<declare-styleable>ですか?
  2. 異なるビューで属性の動作を変えたい場合はどうすればよいですか?たとえば、BannerViewの方向がupまたはのみである場合down
4

1 に答える 1

16

正確には何のポイント<declare-styleable>ですか?

<declare-stylable>タグを使用すると、カスタムビューの属性を宣言して、xmlでそれらのビューに設定できます。属性の使用には、実際には3つの部分があります。

  1. タグの<attr>内側を宣言します。<declare-stylable>
  2. アプリパッケージ名(例)を指すカスタム名前空間をxmlレイアウトで定義しますapp。レイアウトでカスタム属性を使用します(例app:direction="NW")。
  3. AttributeSetカスタムビューで、コンストラクターをパラメーターでオーバーライドし、を取得しTypedArrayて、そこからカスタム属性を読み取ります。次に、コンストラクター内で、これらの属性を適切に使用する方法をビューに指示します。

異なるビューで属性の動作を変えたい場合はどうすればよいですか?たとえば、BannerViewの方向が上または下のみである場合。

次のようなものを試してください。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="direction">
        <enum name="NE" value="0" />
        <enum name="NW" value="1" />
        <enum name="SW" value="2" />
        <enum name="SE" value="3" />
    </attr>

    <declare-styleable name="TriangleView">
        <attr name="direction" />
    </declare-styleable>

    <declare-styleable name="BannerView">
        <attr name="direction" />
        <attr name="thickness" format="dimension" />
    </declare-styleable>
</resources>

TriangleViewまたはのxmlレイアウトを作成するときは、両方の例をBannerView使用できます。inまたは。を使用しapp:direction="NW"たコンストラクターでは、属性の形式は元の属性と同じになりますが、その値で何を行うかは、それぞれのビューでのコンストラクターの実装によって異なります(両方で同じでも異なっていてもかまいません)。AttributeSetTriangleViewBannerView

ビューごとに属性を異なる方法で定義する(つまり、異なる「フォーマット」または「列挙型」)場合は、異なる名前で異なる属性を作成する必要があります。

于 2012-11-20T23:41:40.183 に答える