10

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

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

所以

  • 第一段很清楚:

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

  • 第二个也很清楚:

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

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

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

4

2 回答 2

5

文档中:

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

……

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

  1. 给定 AttributeSet 中的任何属性值。
  2. AttributeSet 中指定的样式资源(名为“style”)。
  3. defStyleAttr 和 defStyleRes 指定的默认样式
  4. 此主题中的基本值。
于 2016-06-14T18:54:56.643 回答
1

这是因为资源合并需要在TypedArray检索到之前发生。

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

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

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

  • 主资源,与主sourceSet相关联,一般位于src/main/res
  • 来自 Build Type 和 Flavor(s) 的变体覆盖。
  • 库项目依赖项,通过其 aar 包中的 res 条目提供资源。

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

于 2016-06-09T06:24:41.007 回答