getResourceId method of TypedArray



我正在阅读关于getResourceId()方法的文档。上面写着:

检索索引处属性的资源标识符。笔记当整个TypedArray对象检索到。因此,此函数将返回资源找到的最终资源值的标识符,不一定由属性指定的原始资源。

所以

  • 第一段很清楚:

检索索引处属性的资源标识符。

  • 第二个也很清楚:

请注意,当整个TypedArray对象。

  • 但这3段是什么意思 为什么它可以返回 而不一定是原始资源id

因此,此函数将返回找到的最终资源值,不一定是原始值由属性指定的资源。

从文档:

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

在确定特定属性的最终值时发挥作用的四个输入:

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

这是因为在检索TypedArray之前需要进行资源合并。

Gradle基本构建系统使用新的合并机制资源。在以前的构建系统中,合并是通过传递aapt的资源文件夹列表,用作覆盖,旁边自动添加覆盖以确保覆盖中的新资源将自动添加(覆盖的默认行为是仅覆盖现有资源,而不创建新资源)。

基于Gradle的构建系统的目标之一是提供更多灵活性,一个经常被问到的功能要求是拥有多个资源文件夹。aapt无法处理因此,新的构建系统引入了一种新的合并机制在aapt之前运行,并生成一个合并的资源文件夹这是给aapt的。这种合并的优点是增量,通过Gradle的输入/输出变化检测,以及它的实现方式在单个文件中应用该改变)。

合并后的资源来自3种类型的来源:

  • 与主sourceSet关联的主资源,通常位于src/main/res中
  • 变体覆盖,来自Build Type和Flavor
  • Library项目依赖项,通过其aar捆绑包中的res条目贡献资源

例如如果使用不同的productFlavorsbuildTypes,则每种口味可能有不同的资源。因此,最初在开发时设定的可能与改变口味后实际呈现的不同。

最新更新