宣言式的重点是什么?

时间:2012-10-02 16:22:38

标签: android attr android-custom-view android-resources declare-styleable

假设我正在制作一些具有可设置属性的新视图。我如此声明它们(这是how the documentation says to do it

<?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>

但这提出了两个问题:

  1. 如果这样有效,<declare-styleable>
  2. 的确切意义何在?
  3. 如果我希望属性在不同的视图中表现不同怎么办?例如,BannerView的方向只能是updown

1 个答案:

答案 0 :(得分:16)

  

<declare-styleable>究竟是什么意思?

使用

<declare-stylable>标记可以声明自定义视图的属性,然后可以在xml中为这些视图设置这些属性。使用该属性实际上有三个部分:

  1. <attr>标记内声明<declare-stylable>
  2. 在xml布局中定义指向应用包名称的自定义命名空间(例如app)。在布局中使用自定义属性(例如app:direction="NW")。
  3. 在自定义视图中,使用AttributeSet参数覆盖构造函数,获取TypedArray并从中读取自定义属性(如果有),然后在构造函数中告诉视图如何使用这些属性适当的属性。
  4.   

    如果我希望属性在不同视图中的行为不同,该怎么办?   例如,如果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>
    

    TriangleViewBannerView构建xml布局时,可以使用app:direction="NW"示例。在AttributeSetTriangleViewBannerView的构造函数中,属性的格式与原始属性相同,但 使用该值取决于每个相应视图中构造函数的实现(两者可以相同或不同)。

    如果您希望不同视图的属性 定义 (即不同的“格式”或“枚举”),则必须使用不同的视图创建不同的属性名。