7

假设我正在创造一些新风格的属性。我宣布他们正是如此(这是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. 如果我希望属性在不同视图中表现不同,该怎么办?例如,如果BannerView的方向只能是updown

回答

15

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

当你建立TriangleViewBannerView你的XML布局,您可以使用这两个app:direction="NW"例子。在TriangleViewBannerViewAttributeSet构造函数,属性将具有相同的格式与原始,但你与价值取决于您的实现在每个相应的视图构造器(可以是相同或两者不同)。

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

+0

真棒,实际上帮助我以及在应用程序库中定义的attr!所以基本上,如果已经定义了attr,它应该用在declare-styleable中,而不要试图覆盖格式。酷酷酷。 – Redwarp