在Android库中,属性名称需要加前缀吗?

4
我已经阅读并确认测试结果,资源值的名称(字符串、可绘制、尺寸等)应该在开头加上前缀(通常是库的名称),以避免名称冲突,因为使用库并声明具有匹配名称的资源的项目将覆盖库的资源。
我不清楚的是,在内部的attr属性的名称是否也应该加上前缀。由于它们被包含在中,它们是否受到保护,不会被覆盖?在Java代码中,它们的资源名称自动添加了的名称前缀,但在XML文件中使用时则没有。
我猜它们的使用是上下文相关的。在我的自定义Preference代码中,当我使用特定的styleable调用context.obtainStyledAttributes()时,只有在那个时候XML属性才会被解释为特定类型。如果我声明了一个名为"min"的Preference styleable属性,类型为float,并在我的项目中使用它,那么v7.preference库的SeekBarPreference styleable中也有一个名为"min"的属性,类型为int,因为SeekBar在调用obtainStyledAttributes()时不使用我的styleable,所以这并不重要。
因此,如果我的假设是正确的,编译器不会按名称合并属性。但是,在Android中,自定义属性样式是一个复杂的问题,我不确定在测试中是否遗漏了什么。为了方便使用/文档,省略我的库属性名称中的前缀将是很好的选择。
如果定义了样式的属性,则我认为它仍然安全,因为样式不会合并。它们只从自己的属性中引用彼此。如果我理解得正确——它们对我来说有些复杂。
另外,是否应该为视图ID添加前缀?我认为是的,因为我的库视图存在于项目的视图结构中,如果库的用户在与我的一个ID匹配的ID上调用findViewById(),我可以想象出搜索首先找到我的视图并使他们困惑的情况。但Google自己的appcompat库没有采取这种预防措施,所以我不确定。
1个回答

5

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

资源属性不是局部的<declare-styleable>。它们都是全局的。当你声明一个资源属性(可以在<declare-styleable>内部或外部完成),你必须为其命名并指定格式类型:

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

当引用资源属性(仅在中使用)时,需列出其名称但不需要列出其格式。
<attr name="my_attribute" /> <!-- This is a reference -->

Lint会在您尝试声明两个具有相同名称的属性时显示错误。
可以在内部声明属性仅仅是为了使代码更简洁,而不意味着其范围受到限制。如果您计划在多个styleables中使用相同的属性,最好将其声明放在任何之外,以便轻松找到。
我注意到的一个奇怪之处是,如果两个不同的库具有重叠的属性声明,Lint不会显示错误。我想,如果它们都具有相同的格式类型,这并不会造成问题。我没有检查它们如果不一样会发生什么。
至于Google为什么不在AppCompat中添加属性名前缀,我认为他们希望它非常易于使用,并且几乎可以与AOSP xml代码互换,因此他们希望属性名称与AOSP中的类似属性名称匹配。因此,他们认为使用简单性大于风险。我怀疑他们忽视了如何设置和使用styleables和属性的文档分散和缺乏连贯性,因此在设置自己的自定义视图和首选项时不明显需要注意什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接