TypedArray的getResourceId方法

GPa*_*ack 9 android android-custom-view typedarray android-resources android-custom-attributes

我正在阅读有关getResourceId()方法的文档.它说:

检索索引处属性的资源标识符.请注意,在检索整个TypedArray对象时,属性资源已解析.因此,此函数将返回找到的最终资源值的资源标识符,而不一定是该属性指定的原始资源.

所以

  • 第一段很清楚:

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

  • 第二个也是明确的:

请注意,在检索整个TypedArray对象时,属性资源已解析.

  • 但3段是什么意思? 为什么它可能 不一定返回原始资源ID

因此,此函数将返回找到的最终资源值的资源标识符,而不一定是该属性指定的原始资源.

Kaa*_*mel 5

文档中

TypedArray obtainStyledAttributes (AttributeSet set, 
                int[] attrs, 
                int defStyleAttr, 
                int defStyleRes)
Run Code Online (Sandbox Code Playgroud)

....

在确定特定属性的最终值时,有四个输入起作用:

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


And*_*tel 1

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

基于 Gradle 的构建系统使用新的资源合并机制。在以前的构建系统中,合并是通过将资源文件夹列表传递给充当覆盖层的 aapt 来完成的,与 --auto-add-overlay 一起确保覆盖层中的新资源将自动添加(覆盖层的默认行为是仅覆盖现有资源,而不创建新资源)。

基于 Gradle 的构建系统的目标之一是提供更大的灵活性,一项常见的功能请求是能够拥有多个资源文件夹。aapt 无法处理此问题,因此新的构建系统引入了一种新的合并机制,该机制在 aapt 之前运行并生成一个单独的合并资源文件夹,并将其提供给 aapt。这种合并的优点是增量式的,既通过 Gradle 的输入/输出更改检测,又通过它的实现方式(即它可以通过仅在单个文件中应用更改来重新运行合并)。

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

  • 主要资源,与主sourceSet相关,一般位于src/main/res
  • 来自构建类型和风味的变体覆盖。
  • 图书馆项目依赖项,通过其 aar 包中的 res 条目提供资源。

例如,如果您使用不同的资源productFlavors,或者buildTypes每种口味可能有不同的资源。所以开发时最初设定的可能和改变口味后实际呈现的不一样。