Вопрос

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

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

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

Warn/Resourccetype (278): без идентификатора пакета при получении значения для номера ресурса 0x00000000 Warn/System.err (278): android.content.res.resources $ notFoundException: идентификатор ресурса строки #0x0

Строка («Пример»), которую я ищу, определенно находится в этом пакете, предоставленном в Strings.xml проекта библиотеки. Я даже вижу это в Р.Джаве

Это было полезно?

Решение

Так что это похоже на

int id = ressources.getidentifier (заголовок, "String", "com.package");

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

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


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

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

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

  • Вы получаете доступ к библиотеке как файл 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/dynamical-retriving-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 из библиотеки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top