我正在阅读有关getResourceId()方法的文档。它说:
检索索引处属性的资源标识符。注意 该属性资源在整个TypedArray对象时已解析 被检索。因此,此函数将返回资源 找到的最终资源值的标识符,不一定 属性指定的原始资源。
所以
检索索引处属性的资源标识符。
请注意,当整个TypedArray时,属性资源已解析 检索对象。
因此,此函数将返回该资源的标识符 找到的最终资源值,不一定是原始值 属性指定的资源。
答案 0 :(得分:4)
来自 documentation:
TypedArray obtainStyledAttributes (AttributeSet set,
int[] attrs,
int defStyleAttr,
int defStyleRes)
...
确定特定属性的最终值时,有 发挥作用的四个输入:
- 给定AttributeSet中的任何属性值。
- AttributeSet中指定的样式资源(名为" style")。
- defStyleAttr和defStyleRes
指定的默认样式- 此主题中的基本值。
醇>
答案 1 :(得分:1)
这是因为Resource Merging需要在检索TypedArray
之前发生。
Gradle-base构建系统使用新的合并机制 资源。在以前的构建系统中,合并是通过传递一个 aapt的资源文件夹列表,作为叠加层,旁边 --auto-add-overlay确保叠加层中的新资源 将自动添加(默认行为是覆盖是 只覆盖现有资源,而不是创建新资源。)
基于Gradle的构建系统的目标之一是提供更多功能 灵活性,一个常见的功能要求是能力 拥有多个资源文件夹。 aapt无法处理 这样,新的构建系统引入了一种新的合并机制 在aapt之前运行并生成一个合并的资源文件夹 这是喂给aapt的。这种合并具有存在的优点 通过Gradle的输入/输出变化检测,和 在它的实现方式(即它只能重新运行合并 将更改应用于单个文件中。)
合并的资源来自3种类型的来源:
- 与主要sourceSet关联的主要资源,通常位于src / main / res
中- 变体叠加,来自Build Type和Flavor(s)。
- 图书馆计划依赖项,通过其aar包中的res条目提供资源。
例如如果您使用不同的productFlavors
或buildTypes
,则每种口味可能会有不同的资源。因此,在开发时最初设置的那个可能与改变风味后实际呈现的不同。