在Android中声明可样式化属性

在Android中声明可样式化属性,android,xml,styleable,declare-styleable,Android,Xml,Styleable,Declare Styleable,关于declare styleable标记的文档很少,通过它我们可以声明组件的自定义样式。我确实找到了attr标记的format属性的有效值。尽管就目前而言这很好,但它并没有解释如何使用其中的一些值。浏览(标准属性的Android源代码),我发现您可以执行以下操作: <!-- The most prominent text color. --> <attr name="textColorPrimary" format="reference|color" /> 这两者似

关于
declare styleable
标记的文档很少,通过它我们可以声明组件的自定义样式。我确实找到了
attr
标记的
format
属性的有效值。尽管就目前而言这很好,但它并没有解释如何使用其中的一些值。浏览(标准属性的Android源代码),我发现您可以执行以下操作:

<!-- The most prominent text color.  -->
<attr name="textColorPrimary" format="reference|color" />
这两者似乎都为指定的样式声明了一组允许的值

所以我有两个问题:

  • 可以接受一组
    enum
    值的样式属性与可以接受一组
    flag
    值的样式属性之间有什么区别
  • 有人知道关于
    declare styleable
    如何工作的更好的文档吗(除了对Android源代码进行反向工程)

  • 这里有一个问题:有一些信息,但不多

    还有这个。它提供了有关标志和枚举的良好信息:

    自定义XML属性标志

    标志是中的特殊属性类型 他们只被允许在非常短的时间内 值的小子集,即 定义在 属性标签。标志由指定 “名称”属性和“值” 属性这些名字必须是 在该属性类型中必须是唯一的 但这些价值观不必如此。这是 在进化过程中 我们拥有的安卓平台 “填充父项”和“匹配父项” 映射到相同的行为。他们的 数值相同

    名称属性映射到名称 在中的值位置使用 布局XML,不需要 名称空间前缀。因此,对于 上面的“平铺模式”我选择“中心”作为 属性值。我本来可以的 就像容易选择的“拉伸”或 “重复”,但没有别的。不 甚至在实际值中替换 本来是允许的

    value属性必须是 整数。选择十六进制还是十六进制 标准的数字表示法是向上的 谢谢你。里面有几个地方 使用两者的Android代码 安卓编译器很乐意这样做 要么接受

    自定义XML属性枚举

    枚举的使用方式几乎相同 以一条规定作为旗帜的方式, 它们可以与其他部件互换使用 整数。引擎盖下枚举和 整数被映射到相同的数据 类型,即整数。什么时候 出现在属性定义中 对于整数,枚举用于防止 “神奇的数字”总是不好的。 这就是为什么你可以有一个 “android:layout_width”带有 维度、整数或命名字符串 “填充父对象。”

    要将此置于上下文中,让我们 假设我创建了一个自定义 属性调用 “布局\滚动\高度”接受 整数或字符串 “滚动到顶部。”为此,我需要添加一个 “integer”格式属性和follow 使用枚举:

    <attr name="layout_scroll_height" format="integer">  
        <enum name="scroll_to_top" value="-1"/> 
    </attr>
    
    获取更多提示

    您可以获得:

    • 布尔值(
      getAttributeBoleanValue
    • 浮动(
      getAttributeFloatValue
    • 整数(
      getAttributeIntValue
    • ints(作为
    getAttributeUnsignedIntValue)
  • 和字符串(
    getAttributeValue

    • @Aleadam的答案非常有帮助,但我认为它忽略了
      enum
      flag
      之间的一个主要区别。前者旨在让我们选择一个,并且在为某个视图指定相应属性时仅选择一个值。但是,可以使用按位OR运算符组合后者的值

      例如,在
      res/values/attr.xml

      <!-- declare myenum attribute -->
      <attr name="myenum">
          <enum name="zero" value="0" />
          <enum name="one" value="1" />
          <enum name="two" value="2" />
          <enum name="three" value="3" />
      </attr>
      
      <!-- declare myflags attribute -->
      <attr name="myflags">
          <flag name="one" value="1" />
          <flag name="two" value="2" />
          <flag name="four" value="4" />
          <flag name="eight" value="8" />
      </attr>
      
      <!-- declare our custom widget to be styleable by these attributes -->
      <declare-styleable name="com.example.MyWidget">
          <attr name="myenum" />
          <attr name="myflags" />
      </declare-styleable>
      
      因此,枚举选择其可能的值之一,而标志可以组合。数值应该反映这种差异,通常您希望枚举(用作数组索引)的序列转到
      0,1,2,3,
      ,而标志转到
      1,2,4,8,
      ,这样就可以独立地添加或删除它们,使用按位或
      |
      组合标志

      我们可以用不是2的幂的值显式定义“元标志”,从而引入一种常用组合的简写。例如,如果我们在
      myflags
      声明中包含了这一点

      <flag name="three" value="3" />
      
      这将允许我一次取消设置或设置所有标志

      更微妙的是,可能是一个标志被另一个标志暗示。因此,在我们的示例中,假设设置的
      eight
      标志应强制设置
      four
      标志(如果尚未设置)。然后我们可以重新定义
      8
      以预先包括
      4
      标志

      <flag name="eight" value="12" /> <!-- 12 == 8|4 -->
      
      
      
      最后,如果要在库项目中声明属性,但希望在另一个项目的布局中应用它们(取决于库),则需要使用名称空间前缀,必须在XML根元素中绑定该前缀。例如:

      <RelativeLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:auto="http://schemas.android.com/apk/res-auto"
          ... >
      
          <com.example.MyWidget
              auto:myenum="two"
              auto:myflags="one|two"
              ... />
      
      </RelativeLayout>
      
      
      
      感谢您提供这些链接。静态类型的博客特别好。这与“真正的文档”非常接近,所以我将其标记为已解决。@Ted确实,这篇文章有很多信息。无论如何,除非您正在编写可重用视图库或扩展框架,否则我不会担心这些枚举。bool、float、int和string可以帮助您实现常规自定义视图。当然,如果这个问题不仅仅是为了满足一个非常健康的好奇心:)@Aleadam-这个问题是由一个真实的应用程序驱动的。我一直在使用自定义属性,需要添加一个新属性。事实证明,新属性的正确格式是枚举,但在阅读您提供的链接之前,我找不到有关使用
      enum
      flag
      @Ted之间区别的任何信息,我很高兴它很有用。在t中还有一些其他的帖子
      <flag name="none" value="0" /> <!-- or "normal, "regular", and so on -->
      <flag name="all" value="15" /> <!-- 15 == 1|2|4|8 -->
      
      <flag name="eight" value="12" /> <!-- 12 == 8|4 -->
      
      <RelativeLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:auto="http://schemas.android.com/apk/res-auto"
          ... >
      
          <com.example.MyWidget
              auto:myenum="two"
              auto:myflags="one|two"
              ... />
      
      </RelativeLayout>