Как сослаться на строку из другого пакета в библиотеке, используя XML в Android? - PullRequest
6 голосов
/ 25 ноября 2011

Документация по Android говорит мне, что я могу получить доступ к строке из другого пакета, используя "имя пакета", что бы это ни значило:

@[<package_name>:]<resource_type>/<resource_name>

Итак, в моем манифесте я хочу получить доступ к строке, которую я поместил в отдельный библиотечный проект, в com.globalmentor.android package --- именно там находится мой класс R, в конце концов:

    <activity
        android:label="@com.globalmentor.android:string/app_applicationlistactivity_label"
        android:name="com.globalmentor.android.app.ApplicationListActivity" >
    </activity>

Это даже не компилируется. Но это делает:

    <activity
        android:label="@string/app_applicationlistactivity_label"
        android:name="com.globalmentor.android.app.ApplicationListActivity" >
    </activity>

Почему? Что означает документация Android, в которой говорится о «имени_пакета»? Почему не работает первый пример, и почему работает второй пример? Я не хочу, чтобы все мои имена ресурсов были объединены в один файл R - я хочу, чтобы они были разбиты на пакеты, как я их написал.

Ответы [ 4 ]

3 голосов
/ 15 мая 2013

Вкратце: префикс имени пакета предназначен для общих библиотек, а не для вашего apk.

Документация гласит:

Для ссылки на ресурс system ,вам нужно будет указать имя пакета

Это соответствует внешним разделяемым библиотекам (и их ресурсам), с которыми связано ваше приложение (например, карты).У них есть свой собственный класс R, не объединенный с классом вашего приложения.

Это все стандартные пакеты android и общие библиотеки, которые вы упомянули в разделе манифеста android.

Как отметил Николай, всеРесурсы приложения объединяются, поэтому большинство проектов библиотек используют префиксы, такие как abs__, для имен своих ресурсов.

См. Документы библиотеки doc для получения дополнительной информации.

2 голосов
/ 18 мая 2013

Почему?

Поскольку вы добавили этот библиотечный проект в свой проект, Android объединяет ресурсы, поэтому последний созданный проект «выигрывает» имя.По этой причине хорошей идеей будет префикс ресурсов.В этом случае «имя_пакета» нельзя использовать, поскольку у вас есть эти ресурсы в вашем собственном проекте.Я предполагаю, что это ваш случай, потому что он компилируется без имени пакета.

Если у вас нет этого библиотечного проекта, добавленного в ваш проект, то возможное решение - использовать SharedUserId.

Источник: http://developer.android.com/tools/projects/index.html

Особенности разработки

При разработке проекта библиотеки и зависимых приложений учитывайте перечисленные ниже моменты:

  • Конфликт ресурсовПоскольку инструменты объединяют ресурсы библиотечного проекта с ресурсами проекта зависимого приложения, в обоих проектах может быть задан определенный идентификатор ресурса.В этом случае инструменты выбирают ресурс из приложения или библиотеки с наивысшим приоритетом и отбрасывают другой ресурс.При разработке приложений помните, что общие идентификаторы ресурсов могут быть определены более чем в одном проекте и будут объединены, причем ресурс из приложения или библиотеки с наивысшим приоритетом будет иметь приоритет.
  • Используйте префиксы дляизбежать конфликтов ресурсов Чтобы избежать конфликтов ресурсов для общих идентификаторов ресурсов, рассмотрите возможность использования префикса или другой согласованной схемы именования, которая уникальна для проекта (или уникальна для всех проектов).
1 голос
/ 25 ноября 2011

Нравится вам это или нет, ресурсы проекта библиотеки объединяются в ресурсы проекта приложения, ресурсы с тем же именем из проекта приложения переопределяют ресурсы из проектов библиотеки. Для подтверждения посмотрите файл R.java в проекте приложения.

Вы можете получить доступ к публично экспортированным ресурсам фреймворка, используя @android:string/foo (пакет 'android'), но я не думаю, что вы можете экспортировать ресурсы из библиотечного проекта, подобного этому (пока).

0 голосов
/ 18 ноября 2014

Назовите свой ресурс в вашем пакете как com.globalmentor.android.app_applicationlistactivity_lab, а не просто app_applicationlistactivity_lab.

<?xml version="1.0" encoding="utf-8"?> <resources> .... <string name="com.globalmentor.android.app_applicationlistactivity_lab">...</string><br> .... </resources>

Тогда вы можете получить к нему доступ из XML как

"@string/com.globalmentor.android.app_applicationlistactivity_lab"

и программно

getResources().getString(R.string.com_globalmentor_android_app_applicationlistactivity_lab);

без конфликтов.

...