重建Android Instant App后,使用功能模块中基本模块中定义的颜色会失败

时间:2017-09-27 15:59:34

标签: android kotlin android-resources android-instant-apps

我的Instant App项目中有一个base模块和一个名为query模块的功能模块。

我的QueryActivity内部query模块使用base模块中的颜色。

QueryActivity.kt

@ColorInt
val textColor: Int = when (resultCode) {
    FetchAddressIntentService.RESULT_SUCCESS -> android.R.color.white
    FetchAddressIntentService.RESULT_FAILURE -> R.color.accent // this color is inside the base module
    else -> R.color.accent // this color is inside the base module
}

如果我尝试run项目,它可以正常工作而没有任何问题。但如果我rebuild项目,它会给我以下错误:

../net/epictimes/uvindex/query/QueryActivity.kt
Error:(133, 63) Unresolved reference: color
Error:(134, 27) Unresolved reference: color

指向那些颜色值。

我通过在colors.xml模块中添加另一个query文件并从中引用base颜色来解决这个问题。它工作正常。您可以在this commit中看到差异。

<color name="query_location_success_text">@android:color/white</color>
<color name="query_location_fail_text">@color/accent</color>

现在它有效,但我不确定为什么。这是正确的方法吗?我的问题不应该是可从功能模块访问的base模块中的资源吗?

版本:

  

Android目标/编译SDK:26

     

Kotlin:1.1.50

     

即时应用:1.1.0

这是我的一个开源项目,你可以看到整个项目here

谢谢

1 个答案:

答案 0 :(得分:9)

是的,当您使用完全限定名称(package_name.R.resource_name)引用基本模块中的资源时,可以从功能模块访问该资源。

Base和子模块具有不同的包名称(您的基本功能包名称为net.epictimes.uvindex,并且您的功能模块包名称为net.epictimes.uvindex.query)。

每个包都包含自己的资源集,并且在编译期间它们的资源ID收集在单独的R包中:

  • net.epictimes.uvindex.R - 适用于您的基本功能模块
  • net.epictimes.uvindex.query.R - 适用于您的功能模块

要从“查询”功能模块访问基本功能的“重音”颜色资源,请使用net.epictimes.uvindex.R.color.accent标识符:

  

FetchAddressIntentService.RESULT_FAILURE - &gt; net.epictimes.uvindex.R.color.accent