Как получить идентификатор ресурса внутри динамического модуля Android?

#java #android #kotlin #android-app-bundle #dynamic-feature-module

#java #Android #котлин #android-app-bundle #динамический-функциональный-модуль

Вопрос:

Я работаю над предоставлением функций динамического модуля, и у меня также есть некоторые доступные ресурсы внутри динамического модуля. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить идентификаторы для ресурсов, однако, если я напрямую ссылаюсь на любой из них, это работает хорошо. Таким образом, проблема возникает только при попытке получить доступ к идентификаторам ресурсов. В настоящее время я пытаюсь сделать это следующим образом :

 val resID = resources.getIdentifier("drawable_name", "drawable",packageName)
 

и это

 val resID = resources.getIdentifier("drawable_name", "drawable","explicit package name of module") 
 

Однако, когда я получаю доступ к чертежу напрямую, например R.drawable.mydrawable , тогда это работает.
Пожалуйста, подскажите мне, как я могу получить доступ к идентификаторам ресурсов, потому что в настоящее время он каждый раз возвращает 0, что означает, что он не может получить доступ к идентификатору.

Ответ №1:

Если вы получили этот resources объект из activity :app , неудивительно, что в динамическом модуле, который был загружен после его создания, нет идентификаторов.

Если вам просто нужно несколько идентификаторов, например, для навигации, вы можете определить идентификаторы в :app модуле с @ id/ помощью , тогда они будут доступны в функциональных xml модулях с @id помощью и в ваших классах с R.id помощью .

Если вы хотите, чтобы идентификатор получал ресурс, вы можете поступить URI.Builder так, как описано в этой документации.

Или, как в примере динамической функции, создайте новый контекст, В котором будут ресурсы, активы и т. Д. Вашего установленного модуля:

  context.createPackageContext("explicit.name.of.package.module.here", 0).also { SplitCompat.install(it) }
 

В этих ресурсах вы можете динамически загружать ресурсы, включая языковые ресурсы. Смотрите эту документацию

Обратите внимание, что вы должны вызвать это после загрузки вашего динамического модуля. Для этого вы можете использовать прослушиватель.

Я не тестировал более поздний способ, но он есть в официальных примерах динамического модуля Android. Дайте нам знать, сработало ли это для вас.

Если вам нужны идентификаторы для инструментальных тестов, таких как Expresso, это еще проще, добавьте в свой :app модуль модуль функций как зависимость (да, вы можете как androidTestImplementation зависимость!):

 androidTestImplementation(project(":my_dynamic_feature"))
 

Наконец, R.drawable.mydrawable это идентификатор. Это a int , вы можете увидеть его в вашем apk classes.dex.

Объясните лучше, каков ваш вариант использования, но хотя бы один из вышеперечисленных должен удовлетворять вашим потребностям.

Ответ №2:

Попробуйте добавить .modulePluginName в качестве суффикса к вашему имени пакета.

Например.Ваше com.android.test имя пакета, а имя вашего динамического модуля moduleHello . Затем установите pluginPackageName = "com.android.test.moduleHello" .

Например, для доступа к ресурсам:

 val resID = resources.getIdentifier("drawable_name", "drawable",pluginPackageName)
 

Комментарии:

1. Я уже пробовал это, явно используя имя пакета модуля, но это не сработало, поэтому в итоге я использовал отражение