【发布时间】: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 库没有采取这种预防措施,所以我不确定。
【问题讨论】: