Не удается программно получить ресурс из другого модуля

У меня есть проект Android с несколькими модулями Gradle. Зависимости между модулями выглядят следующим образом:
app ‹-- coremodule ‹-- featuremodule

В coremodule есть ресурсы (строки и цвета).

Когда я использую их в макете из featuremodule, все в порядке, они доступны и работают как положено. Но когда я пытаюсь получить их программно в Activity из featuremodule, я получаю исключение: Неразрешенная ссылка: R

Итак, android:text="@string/res_from_core_module" работает, а myTextView.setText(R.string.res_from_core_module) не работает.

У кого-нибудь есть идеи, почему это происходит и как это решить?


person Mikhail Sidorov    schedule 11.04.2018    source источник
comment
поделитесь полным кодом и деталями ошибки   -  person Pavneet_Singh    schedule 11.04.2018


Ответы (4)


Причиной такого поведения было добавление зависимости 'coremodule' с compileOnly.

build.gradle для модуля приложения выглядел так:

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

если изменить compileOnly на implementation (или API) все в порядке

dependencies {
    ...
    implementation project(path: ':coremodule')
    ...
}
person Mikhail Sidorov    schedule 19.01.2019

Я думаю, что R указывает на ресурсы вашего приложения. Проверьте импорт в начале файла.

Вы должны явно указать папку ресурсов в методе следующим образом:

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

person BEAGLE ENTERTAIN    schedule 11.04.2018
comment
Если я не ошибаюсь, файл R является общим для проекта и модулей. В любом случае это было первое, что я попробовал - никаких изменений. Ошибка была та же: Неразрешенная ссылка: R - person Mikhail Sidorov; 12.04.2018

Добавьте это во все модули, чтобы делиться ресурсами, классами, функциями

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

    ...
}
person hungtran273    schedule 21.12.2020
comment
как это работает, если я не использую зависимости с диска? - person Mikhail Sidorov; 22.12.2020

Пожалуйста, используйте так:

myTextView.setText(getString(R.string.res_from_core_module));
person Raman Sharma    schedule 11.04.2018
comment
setText(@StringRes) call setText(getString(@StringRes)) , поэтому на самом деле нет никакой разницы между вызовом этих двух методов, и в результате я получил ту же ошибку. Неразрешенная ссылка: R - person Mikhail Sidorov; 12.04.2018