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>

但这提出了两个问题:

  1. 如果这行得通,那到底有什么意义<declare-styleable>
  2. 如果我希望属性在不同视图中表现不同怎么办?例如 ifBannerView的方向只能是upor down
4

1 回答 1

16

究竟有什么意义<declare-styleable>

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

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

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

当您为TriangleViewor构建 xml 布局时BannerView,您可以同时使用该app:direction="NW"示例。在带有AttributeSetinTriangleView或的构造函数中BannerView,属性将具有与原始格式相同的格式,但您对该值的处理取决于您在每个视图中对构造函数的实现(两者可以相同或不同)。

如果您希望为不同的视图定义不同的属性(即不同的“格式”或“枚举”),那么您必须创建具有不同名称的不同属性。

于 2012-11-20T23:41:40.183 回答