gpt4 book ai didi

android - declare-styleable 有什么意义?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:27 28 4
gpt4 key购买 nike

假设我正在制作一些具有可样式化属性的新 View 。我这样声明它们(这是 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. 如果我希望属性在不同 View 中表现不同怎么办?例如,如果 BannerView的方向只能是updown .

最佳答案

What exactly is the point of <declare-styleable>?

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

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

What if I want the attribute to behave differently in different views? For example if BannerView's direction can only be up or down.

尝试这样的事情:

<?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 , 您可以使用 app:direction="NW"两者的例子。在带有 AttributeSet 的构造函数中在TriangleViewBannerView ,属性将具有与原始格式相同的格式,但是您对该值的操作取决于您在每个 View 中对构造函数的实现(可以是相同的或两者不同)。

如果您希望为不同的 View 定义不同的属性(即不同的“格式”或“枚举”),那么您必须使用不同的属性创建不同的属性名字。

关于android - declare-styleable 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12694297/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com