TypedArray的getResourceId方法

10
我正在阅读关于getResourceId()方法的文档。它说:
检索索引处属性的资源标识符。请注意,当检索整个TypedArray对象时,属性资源将被解析。因此,该函数将返回找到的最终资源值的资源标识符,而不一定是属性指定的原始资源。
因此,
第一段很清楚:
检索索引处属性的资源标识符。
第二段也很清楚:
请注意,当检索整个TypedArray对象时,属性资源将被解析。
但第三段是什么意思?为什么它可能会返回不一定是原始资源id?
结果,该函数将返回找到的最终资源值的资源标识符,而不一定是属性指定的原始资源。
2个回答

5

根据文档

TypedArray obtainStyledAttributes (AttributeSet set, 
                int[] attrs, 
                int defStyleAttr, 
                int defStyleRes)

在确定特定属性的最终值时,有四个输入需要考虑:

  1. 给定AttributeSet中的任何属性值。
  2. AttributeSet中指定的样式资源(命名为"style")。
  3. defStyleAttr和defStyleRes指定的默认样式。
  4. 此主题中的基本值。

1
这是因为资源合并需要在检索TypedArray之前进行。
Gradle基础构建系统使用了一种新的资源合并机制。在之前的构建系统中,合并是通过将资源文件夹列表传递给aapt来完成的,这些资源文件夹充当覆盖层,并使用--auto-add-overlay以确保新的覆盖层资源会自动添加(默认行为是仅覆盖现有资源,而不是创建新的资源)。
Gradle基于构建系统的目标之一是提供更多的灵活性,而一个经常被要求的功能请求是具有多个资源文件夹的能力。aapt无法处理这个问题,因此新的构建系统引入了一个新的合并机制,在aapt之前运行,并生成一个单独的、合并的资源文件夹,然后将其提供给aapt。这种合并具有增量优势,既通过Gradle的输入/输出更改检测,也通过它的实现方式(即它可以通过仅应用单个文件中的更改来重新运行合并)。
合并的资源来自3种来源: - 主要资源,与主要源集相关联,通常位于src/main/res - 变体覆盖层,来自Build Type和Flavor(s) - 库项目依赖项,通过它们的aar包中的res条目贡献资源。
如果您使用不同的productFlavorsbuildTypes,则每个风味可能具有不同的资源。因此,在更改风味后,最初在开发时设置的资源可能与实际呈现的资源不同。

但在我看来,这似乎是一个运行时问题,而不是构建时问题。 - GPack

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