gpt4 book ai didi

android - Android 库中的属性名称是否需要前缀?

转载 作者:数据小太阳 更新时间:2023-10-29 02:38:55 26 4
gpt4 key购买 nike

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

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

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

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

如果<declare-styleable>正在为 Style 定义属性,那么我认为它仍然不会发生冲突,因为 Styles 不会合并。它们只是从各自的属性中相互引用。如果我对它们的理解正确的话——它们对我来说有些令人费解。

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

最佳答案

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

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

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

当您引用资源属性时(仅在 <declare-styleable> 中完成),您列出了它的名称而不是它的格式。

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

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

您可以在 <declare-styleable> 中声明一个属性仅仅是代码简洁的方便。这并不意味着范围有限。如果您计划在多个样式中使用相同的属性,最好将其声明放在任何 <declare-styleable> 之外。 , 所以很容易找到。

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

至于Google 为什么不在AppCompat 中给属性名加前缀,我想他们希望它非常易于使用,并且几乎可以与AOSP xml 代码互换,所以他们希望属性名与AOSP 中类似的属性名相匹配。因此他们认为使用的简单性超过了风险。我怀疑他们忽略了关于设置和使用样式和属性的文档是多么的困惑和缺乏,因此在设置我们自己的自定义 View 和首选项时要注意什么并不明显。

关于android - Android 库中的属性名称是否需要前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44938602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com