В моем приложении для Android я создал библиотеку, которая разделяет некоторые строковые ресурсы с основным проектом.Отсутствие опциональной концепции пространства имен в слиянии ресурсов Android
Main project --------------> main resources (e.g. string)
library project -----------> library resources (e.g. string)
Давайте предположит, что:
<string name="app_name">The new app name</string> (in main)
<string name="app_name">The standard app name</string> (in library)
Google утверждает, что есть слияние во время компиляции и рекомендует использовать жёстко прописанные префиксы на уровне ресурсов для предотвращения слияния:
В тех случаях, когда Идентификатор ресурса определяется как в приложении, так и в библиотеке, инструменты обеспечивают, чтобы ресурс, объявленный в приложении, получил приоритет и что ресурс в проекте библиотеки не скомпилирован в приложение .ap к. Это дает вашему приложению гибкость в использовании или переопределении любых типов поведения ресурсов или значений, определенных в любой библиотеке.
Я думаю, что у меня есть сочетание необходимых поведения:
- для некоторых ресурсов, которые я хочу библиотека использует ресурс перекрываться основным ресурсом
- для некоторых ресурсов, которые я хочу библиотека продолжает использовать свои собственные библиотечные ресурсы без слияния
Я думаю, что жесткая кодировка префикса noec но я бы ожидал, что google предоставит вид attr, для каждого файла ресурсов или каждого ресурса, к необязательно внутреннему префиксу (с чем-то именем пакета), чтобы разработчик мог получить доступ к ресурсу, недоступному для переопределения. Что-то как:
<string name="app_name" prefix="yes"></string>
(«префикс» атр добавленного мной поручив компилятор, чтобы сохранить ресурс, как, например, package_name.app_name для предотвращения слияния с app_name) и в библиотеке коды доступ будет строка, как
getResources().getPrefixedString(R.id.app_name)
Я также знаю, что я могу ссылаться на ресурсы по идентификатору, в виде отражения, а
getResources().getIdentifier("res_name", "res_type", "com.library.package");
но есть 3 недостатков с этим подходом, если я хочу, чтобы вручную смоделировать такое поведение:
- более низкую производительность
- Я до сих пор, чтобы добавить свой жёстко пространство имен в качестве префикса для всех требуемых строк и
- ресурсы не могут быть вызваны из самого XML (если вы не жёстко префикс, а).
Есть ли в настоящее время какой-либо механизм для указания компилятора, если я хочу объединить ресурс или нет?
«Я думаю, что у меня есть сочетание требуемого поведения» - почему существует ваш второй маркированный сценарий? Просто не определяйте ресурс в приложении, поэтому он извлекает его из библиотеки. – CommonsWare
моя строка определена в 2 библиотеках плюс необязательное основное приложение, и я ожидаю, что каждая библиотека будет потреблять свой собственный ресурс, а не переопределять. Вот почему я ожидаю, что смогу опционально определить какое-то пространство имен, чтобы предотвратить слияние ресурсов библиотеки. – pellyadolfo
Пример: ваше приложение использует 2 библиотеки. Оба имеют одинаковые имена ресурсов. Какой ресурс будет использоваться этим именем? – m0rphine