假设我正在制作一些具有可设置属性的新视图。我如此声明它们(这是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>
但这提出了两个问题:
<declare-styleable>
BannerView
的方向只能是up
或down
。答案 0 :(得分:16)
使用
<declare-styleable>
究竟是什么意思?
<declare-stylable>
标记可以声明自定义视图的属性,然后可以在xml中为这些视图设置这些属性。使用该属性实际上有三个部分:
<attr>
标记内声明<declare-stylable>
。app
)。在布局中使用自定义属性(例如app:direction="NW"
)。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
或BannerView
构建xml布局时,可以使用app:direction="NW"
示例。在AttributeSet
或TriangleView
中BannerView
的构造函数中,属性的格式与原始属性相同,但 做 使用该值取决于每个相应视图中构造函数的实现(两者可以相同或不同)。
如果您希望不同视图的属性 定义 (即不同的“格式”或“枚举”),则必须使用不同的视图创建不同的属性名。