TypedArray的getResourceId方法

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

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

所以

  • 第一段是明确的:

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

  • 第二个也很清楚:

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

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

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

Solutions Collecting From Web of "TypedArray的getResourceId方法"

从文档 :

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

….

当确定一个特定属性的最终值时,有四个input发挥作用:

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

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

Gradle-base构build系统使用新的资源合并机制。 在以前的构build系统中,合并是通过将资源文件夹列表传递给作为叠加层的aapt,并与–auto-add-overlay一起确保叠加层中的新资源将被自动添加(默认行为是覆盖层是只覆盖现有的资源,而不是创build新的资源)。

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

合并的资源来自三种来源:

  • 与主要sourceSet相关的主要资源通常位于src / main / res中
  • 来自Build Type的变体重叠和Flavor(s)。
  • 图书馆项目依赖关系,它通过在他们的aar包中的res入口贡献资源。

例如,如果您使用不同的productFlavorsbuildTypes ,则每种风格的资源可能会有所不同。 所以在开发时最初设定的可能与改变风味后实际提供的不同。