Доступ к ресурсам приложений из проекта библиотеки - программирование
Подтвердить что ты не робот

Доступ к ресурсам приложений из проекта библиотеки

Мое приложение зависит от проекта библиотеки.

Файл menu.xml находится в проекте приложения.
Все java-коды находятся в рамках проекта библиотеки, включая код обработчика меню onOptionsItemSelected().

Есть ли способ получить доступ к ресурсам приложения из проекта библиотеки? Я бы хотел написать что-то вроде этого, что в настоящее время невозможно, поскольку пункты меню не видны из библиотеки:

if ( item.getItemId()==R.id.settings ) {
...
}
4b9b3361

Ответ 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 позже, и явная маркировка использования внешних ресурсов облегчает их обнаружение.