【问题标题】:getResourceId method of TypedArrayTypedArray 的 getResourceId 方法
【发布时间】:2016-10-04 08:25:59
【问题描述】:
我正在阅读有关 getResourceId() 方法的文档。它说:
检索索引处属性的资源标识符。笔记
当整个 TypedArray 对象解析时,该属性资源
被检索。结果,此函数将返回资源
找到的最终资源值的标识符,不一定
属性指定的原始资源。
所以
检索索引处属性的资源标识符。
注意属性resource作为解析时整体TypedArray
对象被检索。
-
但是第 3 段是什么意思? 为什么它可以返回 不一定是原始资源 id?
因此,此函数将返回资源标识符
找到的最终资源值,不一定是原始的
由属性指定的资源。
【问题讨论】:
标签:
android
android-custom-view
android-resources
android-custom-attributes
typedarray
【解决方案1】:
从
documentation:
TypedArray obtainStyledAttributes (AttributeSet set,
int[] attrs,
int defStyleAttr,
int defStyleRes)
....
在确定特定属性的最终值时,有
发挥作用的四个输入:
- 给定 AttributeSet 中的任何属性值。
- AttributeSet 中指定的样式资源(名为“style”)。
- defStyleAttr 和 defStyleRes 指定的默认样式
- 此主题中的基本值。
【解决方案2】:
这是因为Resource Merging 需要在TypedArray 被检索之前发生。
基于 Gradle 的构建系统使用新的合并机制
资源。在以前的构建系统中,合并是通过传递一个
充当覆盖的 aapt 资源文件夹列表,旁边
--auto-add-overlay 确保覆盖中的新资源
将被自动添加(默认行为是覆盖是
只覆盖现有资源,而不是创建新资源)。
基于 Gradle 的构建系统的目标之一是提供更多
灵活性,一个经常被问到的功能要求是能力
拥有多个资源文件夹。 aapt 无法处理
因此,新的构建系统引入了一种新的合并机制,
在 aapt 之前运行并生成一个合并的资源文件夹
那是喂给aapt的。这种合并的好处是
增量,通过 Gradle 的输入/输出变化检测,以及
以它的实现方式(即它只能重新运行合并
在单个文件中应用更改)。
合并的资源来自 3 类来源:
- 主资源,与主sourceSet相关联,一般位于src/main/res
- 变体叠加层,来自构建类型和风味。
- Library Project 依赖项,通过其 aar 包中的 res 条目贡献资源。
例如如果您使用不同的productFlavors 或buildTypes,则每种风味可能有不同的资源。所以开发时最初设定的可能与更改风味后实际呈现的有所不同。