【问题标题】:Can't programmatically get resource from another module无法以编程方式从另一个模块获取资源
【发布时间】:2018-04-11 16:40:58
【问题描述】:

我有一个带有几个 gradle 模块的 android 项目。模块之间的依赖关系如下所示:
应用

coremodule 中有一个资源(字符串和颜色)。

当我在功能模块的布局中使用它们时,一切正常,它们可用并且按预期工作。 但是,当我尝试从功能模块中以编程方式在 Activity 中获取它们时,出现异常:未解析的引用:R

所以android:text="@string/res_from_core_module" 有效myTextView.setText(R.string.res_from_core_module) 无效

有人知道为什么会发生这种情况以及如何解决这个问题吗?

【问题讨论】:

  • 分享完整代码和错误详情

标签: android android-resources android-module


【解决方案1】:

这种行为的原因是使用 compileOnly 添加 'coremodule' 依赖项。

app 模块的 build.gradle 看起来像:

dependencies {
    ...
    compileOnly project(path: ':coremodule')
    ...
}

如果用 implementation(或 api)更改 compileOnly 一切正常

dependencies {
    ...
    implementation project(path: ':coremodule')
    ...
}

【讨论】:

    【解决方案2】:

    我认为 R 指向您应用的资源。检查文件开头的导入。

    您应该像这样在方法中显式指向资源文件夹:

    myTextView.setText(com.coremodule.R.string.res_from_core_module)

    【讨论】:

    • 如果我没记错的话,R 文件是项目和模块的通用文件。无论如何,这是我尝试的第一件事——没有改变。错误是一样的:“未解决的参考:R”
    【解决方案3】:

    将此添加到所有模块以共享资源、类、函数

    dependencies {
        implementation fileTree(dir: "libs", include: ["*.jar"])
    
        ...
    }
    

    【讨论】:

    • 如果我不使用来自磁盘的依赖项,它是如何工作的?
    【解决方案4】:

    最新答案!!!它将使您的应用模块可以访问所有内容。

    dependencies {
        ...
        api project(': coremodule')
        ...
    }
    

    【讨论】:

      【解决方案5】:

      请这样使用:

      myTextView.setText(getString(R.string.res_from_core_module));
      

      【讨论】:

      • setText(@StringRes) call setText(getString(@StringRes)) ,所以实际上调用这两种方法没有区别,结果我得到了同样的错误“未解决的参考:R”
      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      相关资源
      最近更新 更多