我正在阅读关于getResourceId()方法的文档。上面写着:
检索索引处属性的资源标识符。笔记当整个TypedArray对象检索到。因此,此函数将返回资源找到的最终资源值的标识符,不一定由属性指定的原始资源。
所以
- 第一段很清楚:
检索索引处属性的资源标识符。
- 第二个也很清楚:
请注意,当整个TypedArray对象。
- 但这3段是什么意思 为什么它可以返回 而不一定是原始资源id
因此,此函数将返回找到的最终资源值,不一定是原始值由属性指定的资源。
从文档:
TypedArray obtainStyledAttributes (AttributeSet set,
int[] attrs,
int defStyleAttr,
int defStyleRes)
在确定特定属性的最终值时发挥作用的四个输入:
- 给定AttributeSet中的任何属性值
- AttributeSet中指定的样式资源(名为"style")
- defStyleAttribute和defStyleRes指定的默认样式
- 此主题中的基本值
这是因为在检索TypedArray
之前需要进行资源合并。
Gradle基本构建系统使用新的合并机制资源。在以前的构建系统中,合并是通过传递aapt的资源文件夹列表,用作覆盖,旁边自动添加覆盖以确保覆盖中的新资源将自动添加(覆盖的默认行为是仅覆盖现有资源,而不创建新资源)。
基于Gradle的构建系统的目标之一是提供更多灵活性,一个经常被问到的功能要求是拥有多个资源文件夹。aapt无法处理因此,新的构建系统引入了一种新的合并机制在aapt之前运行,并生成一个合并的资源文件夹这是给aapt的。这种合并的优点是增量,通过Gradle的输入/输出变化检测,以及它的实现方式在单个文件中应用该改变)。
合并后的资源来自3种类型的来源:
- 与主sourceSet关联的主资源,通常位于src/main/res中
- 变体覆盖,来自Build Type和Flavor
- Library项目依赖项,通过其aar捆绑包中的res条目贡献资源
例如如果使用不同的productFlavors
或buildTypes
,则每种口味可能有不同的资源。因此,最初在开发时设定的可能与改变口味后实际呈现的不同。