Android -импорт Ressources из библиотечного проекта
-
12-10-2019 - |
Вопрос
Можно ли использовать 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 из библиотеки.