Android импорт ресурсов из проекта библиотеки

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

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

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

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

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

4 ответов


похоже

int id = ресурсы.getIdentifier (название, "строка", " com.пакет");

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

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


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

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

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

  • вы получаете доступ к библиотеке в виде файла jar? Вы можете 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


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

import com.application.libraryproject.R

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

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

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


у меня была аналогичная проблема и я решил ее с getPackageName() метод в библиотеке проекта.

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

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

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