TypedArray的getResourceId方法

时间:2016-06-04 09:09:01

标签: android android-custom-view android-resources android-custom-attributes typedarray

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

  

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

所以

  • 第一段很清楚:
  

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

  • 第二个也很清楚:
  

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

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

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

2 个答案:

答案 0 :(得分:4)

来自 documentation

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

...

  

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

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

答案 1 :(得分:1)

这是因为Resource Merging需要在检索TypedArray之前发生。

  

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

     

基于Gradle的构建系统的目标之一是提供更多功能   灵活性,一个常见的功能要求是能力   拥有多个资源文件夹。 aapt无法处理   这样,新的构建系统引入了一种新的合并机制   在aapt之前运行并生成一个合并的资源文件夹   这是喂给aapt的。这种合并具有存在的优点   通过Gradle的输入/输出变化检测,和   在它的实现方式(即它只能重新运行合并   将更改应用于单个文件中。)

     

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

     
      
  • 与主要sourceSet关联的主要资源,通常位于src / main / res
  • 中   
  • 变体叠加,来自Build Type和Flavor(s)。
  •   
  • 图书馆计划依赖项,通过其aar包中的res条目提供资源。
  •   

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