【问题标题】:Do attribute names in an Android library need to be prefixed?Android 库中的属性名称是否需要添加前缀?
【发布时间】:2017-07-06 01:55:07
【问题描述】:

我已经阅读(并通过测试确认)资源值名称(字符串、Drawables、尺寸等)应该在开头(通常是库的名称)有一个前缀以避免名称冲突,因为使用的项目库并声明具有匹配名称的资源将覆盖库的资源。

我不清楚<declare-styleable> 内的attr 属性的名称是否也应该加上前缀。由于它们被包裹在<declare-styleable> 中,它们是否受到保护以防被覆盖?在 Java 代码中,它们的资源名称会自动以 <declare-styleable> 的名称作为前缀,但在 XML 文件中使用时则不会。

我猜他们的用法是上下文相关的。在我的自定义首选项代码中,当我使用特定样式调用 context.obtainStyledAttributes() 时,只有在那时 XML 属性才被解释为特定类型。如果我声明了一个名为"min"float 类型的Preference 可样式属性并在我的项目中使用它,那么在v7.preference 库的int 类型的SeekBarPreference 可样式属性中有一个名为"min" 的属性并不重要,因为 SeekBar 在调用 obtainStyledAttributes() 时不使用我的样式。

因此,如果我的假设是正确的,那么编译器就没有理由像这样按名称合并属性。但是自定义属性样式在 Android 中是一个复杂的野兽,我不确定我是否在测试中遗漏了一些东西。为了便于使用/记录,省略我库的属性名称中的前缀会很好。

如果<declare-styleable> 正在为样式定义属性,那么我认为它仍然可以避免冲突,因为样式不会合并。它们仅从各自的属性中相互引用。如果我正确理解它们——它们对我来说有点令人费解。

在相关说明中,是否有任何理由应该为视图 ID 添加前缀?我想是的,因为我的库视图存在于项目的视图结构中,并且库的用户在与我的一个匹配的 ID 上调用 findViewById(),我可以设想搜索首先出现我的视图并绊倒它们的场景向上。但是 Google 自己的 appcompat 库没有采取这种预防措施,所以我不确定。

【问题讨论】:

    标签: android xml


    【解决方案1】:

    在研究了文档和 AOSP 源代码后,我得出的结论是是的,您应该为属性名称添加前缀。

    资源属性不是<declare-styleable> 本地的。它们都是全球性的。当你声明一个资源属性时(可以在 <declare-styleable> 内部或外部完成),你命名它并给它一个格式类型:

    <attr name="my_attribute" format="string" /> <!-- This is a declaration -->
    

    当您引用资源属性(仅在&lt;declare-styleable&gt; 中完成)时,您列出了它的名称,但没有列出它的格式。

    <attr name="my_attribute" /> <!-- This is a reference -->
    

    如果您尝试声明两个具有相同名称的属性,Lint 会显示错误。

    您可以在&lt;declare-styleable&gt; 中声明属性这一事实仅仅是为了代码简洁。它并不意味着有限的范围。如果您计划在多个样式中使用相同的属性,最好将其声明放在任何 &lt;declare-styleable&gt; 之外,这样可以很容易地找到它。

    我注意到的一个奇怪之处是,如果两个不同的库具有重叠的属性声明,Lint 不会显示错误。我想如果它们都具有相同的格式类型,这不会引起问题。我还没有检查如果他们不这样做会发生什么。

    至于为什么 Google 不在 AppCompat 中为属性名称添加前缀,我认为他们希望它非常易于使用,并且几乎可以与 AOSP xml 代码互换,因此他们希望属性名称与 AOSP 中的相似属性名称匹配。因此他们认为使用的简单性大于风险。我怀疑他们忽略了在设置和使用样式和属性方面的脱节和缺乏文档,因此在设置我们自己的自定义视图和首选项时要注意什么并不明显。

    【讨论】:

      猜你喜欢
      • 2010-12-14
      • 2021-04-10
      • 2011-09-22
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      相关资源
      最近更新 更多