Доступ к ресурсам приложений из проекта библиотеки
Мое приложение зависит от проекта библиотеки.
Файл menu.xml находится в проекте приложения.
Все java-коды находятся в рамках проекта библиотеки, включая код обработчика меню onOptionsItemSelected().
Есть ли способ получить доступ к ресурсам приложения из проекта библиотеки? Я бы хотел написать что-то вроде этого, что в настоящее время невозможно, поскольку пункты меню не видны из библиотеки:
if ( item.getItemId()==R.id.settings ) {
...
}
Ответы
Ответ 1
Да, если вы знаете имя пакета вашей библиотеки.
Resource.getIdentifier(...)
Вы можете сделать:
getResources().getIdentifier("res_name", "res_type", "com.library.package");
Пример:
R.id.settings
будет:
getResources().getIdentifier("settings", "id", "com.library.package");
Ответ 2
Вы действительно должны просто включить версию ресурса menu.xml
в свой библиотечный проект. Если вы хотите, чтобы в вашем приложении был другой menu.xml
, вы можете сделать это, и он заменит копию из библиотечного проекта.
Из документов Библиотечные проекты:
В тех случаях, когда идентификатор ресурса определяется как в приложении, так и в библиотеке, инструменты гарантируют, что ресурс, объявленный в приложении, получит приоритет и что ресурс в проекте библиотеки не будет скомпилирован в приложение .apk. Это дает вашему приложению возможность гибко использовать или переопределять любое поведение ресурсов или значения, определенные в любой библиотеке.
Ответ 3
Я обнаружил, что @triadрешение с Resources.getIdentifier(String, String, String)
несколько подвержено ошибкам:
- Строково-буквенные идентификаторы ресурса не проверяются IDE
- несколько аргументов
String
легко использовать неправильно.
Я нашел этот подход, чтобы работать лучше для меня:
String libString = context.getString(example.library.pkg.R.string.library_string)
Где пакет библиотеки example.library.pkg
.
- Класс библиотеки
R
разрешается во время компиляции, поэтому ваша IDE сообщит вам, правильно ли вы на него ссылались
- Отсутствие
import
в классе библиотеки R
позволяет вам все еще использовать свой собственный локальный R
позже,
и явная маркировка использования внешних ресурсов облегчает их обнаружение.