Подтвердить что ты не робот

Android import ressources из проекта библиотеки

Можно ли использовать ресурсы ressources, такие как строки, определенные в библиотечных проектах в прикладных проектах? если да, то как? потому что я наклоняю, кажется, разрешаю строки, которые я бы хотел решить следующим образом:

String title = "sample";
int id = ressources.getIdentifier(title, "string", "com.package");

дает мне это исключение

WARN/ResourceType (278): идентификатор пакета при получении значения для номера ресурса 0x00000000 WARN/System.err(278): android.content.res.Resources $NotFoundException: Идентификатор ресурса строки # 0x0

строка ( "sample" ), которую я ищу, определенно находится в этом пакете, представленном в файле strings.xml проекта библиотеки. я даже вижу его в R.java

4b9b3361

Ответ 1

Итак, это выглядит как

int id = ressources.getIdentifier(title, "string", "com.package" );

возвращает 0, то есть не может найти указанный ресурс. Последующий вызов ressources.getIdentifer() вызывает исключение, поскольку 0 не является допустимым идентификатором ресурса.

Вот несколько отладочных/альтернативных идей:


  • Вы, наверное, уже сделали это десяток раз, но это не помешает упоминать: сначала перепроверьте написание всего:

    • правильность написания пакетов (как в проекте библиотеки, так и в проекте клиента),
    • строка ресурса верна (проект библиотеки и клиентский проект),
    • правильно написана библиотека в элементе uses-library AndroidManifest.xml,
    • и др.

  • Можно ли получить доступ к любым ресурсам в этой библиотеке или является проблемой, специфичной для этого ресурса (title), или она специфична для этого типа ресурсов (строк)? Можете ли вы получить доступ к ресурсам другой библиотеки?

  • Вы получаете доступ к библиотеке как файл jar? Вы можете jar код, но вы не можете получить доступ к ресурсам из банки.

Android. Возможно ли создать пользовательскую библиотеку для использования в нескольких приложениях?


  • Вы пробовали альтернативный формат имени:

код

String fullyQualifiedResourceName = "com.package:string/sample";
int id = ressources.getIdentifier(title, null, null);
if (id == 0) {
    Log.e(TAG, "Lookup id for resource '"+fullyQualifiedResourceName+"' failed";
    // graceful error handling code here
}

  • Вы можете попробовать использовать отражение:

код

final String resourceName= "sample";
final int id;
try {
    final Class resourceType = com.package.R.string.class;
    final Field field = resourceType.getField(title);
    id = field.getInt(null);
} catch (final Exception e) {
    Log.e(TAG, "Lookup id for resource '"+resourceName+"' failed";
    // graceful error handling code here
}

Android, получив идентификатор ресурса из строки?

http://daniel-codes.blogspot.com/2009/12/dynamically-retrieving-resources-in.html

Ответ 2

В коде проекта импортируйте класс R:

import com.application.libraryproject.R

Затем вы можете ссылаться на любую строку или другой ресурс, определенный как xml, следующим образом:

String mystring = getString(R.string.app_name);

или аналогичный.

Ответ 3

У меня была аналогичная проблема, и я решил ее с помощью метода getPackageName() в Библиотеке проектов.

В вашем случае это должно быть:

String title = "sample";
int id = ressources.getIdentifier(title, "string", getPackageName());

Ответ 4

Да, укажите ресурсы в проекте библиотеки, как обычно. Затем ссылайтесь на них в проекте, импортируя библиотеку, добавив класс R с именем пакета в AndroidManifest.xml библиотеки.