【问题标题】:getResourceId method of TypedArrayTypedArray 的 getResourceId 方法
【发布时间】:2016-10-04 08:25:59
【问题描述】:

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

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

所以

  • 第一段很清楚:

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

  • 第二个也很清楚:

注意属性resource作为解析时整体TypedArray 对象被检索。

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

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

【问题讨论】:

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


    【解决方案1】:

    documentation:

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

    ....

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      • 主资源,与主sourceSet相关联,一般位于src/main/res
      • 变体叠加层,来自构建类型和风味。
      • Library Project 依赖项,通过其 aar 包中的 res 条目贡献资源。

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

      【讨论】:

      • 但在我看来这是一个运行时问题,而不是构建时间
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2016-06-04
      • 2016-09-02
      • 2011-11-20
      • 2014-09-11
      • 2018-12-21
      • 2020-02-08
      相关资源
      最近更新 更多