2014-02-14 3 views
2

Resources.getIdentifier(String,String,String) требуется пакет ресурсов. К сожалению, если APK был построен с опцией aapt--rename-manifest-package, пакет ресурсов не будет таким же, как пакет, возвращенный с Context.getPackageName(). Например, если AndroidManifest.xml имеет следующее:Список доступных пакетов ресурсов Android во время выполнения?

<manifest package="foo.bar" ...> 
... 
</manifest> 

но aapt запускается с --rename-manifest-package foo.bar.baz, то ресурсы APK будет иметь имя пакета foo.bar в то время как Context.getPackageName() вернется foo.bar.baz. Таким образом, призывы к Resources.getIdentifier(String,String,String) будут возвращать 0 всякий раз, когда используется имя пакета от Context.getPackageName().

Как я могу получить список доступных пакетов ресурсов в APK, чтобы я мог искать их для моего идентификатора ресурса?

ответ

1

См https://groups.google.com/forum/?fromgroups=#!topic/adt-dev/cqdjG2TuM-I

Ксавьера Ducrohet:

Они делают предположение, что имя пакета приложения является такой же как класс R. Это действительно неправильно. Хотя предыдущая сборка несколько подразумевала это, у aapt всегда была функция генерации класса R в другом пакете.

Думая об этом, на самом деле нет текущего способа запросить приложение для пакета класса R. Он должен быть предоставлен в библиотеку.

В принципе, нет возможности сделать это. Имя пакета должно быть явно передано в библиотеку.

Вы можете автоматизировать пропускание имени пакета по using a dummy R file:

Это легко исправить, хотя, путем извлечения имени пакета другого ресурса с Resources.getResourcePackageName().

Давайте создадим идентификатор ресурса, посвященный этой цели, например, в Рез/значений/ids.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item name="used_for_package_name_retrieval" type="id"/> 
</resources> 

И теперь мы получаем правильный пакет:

Resources res = context.getResources(); 
String packageName = res.getResourcePackageName(R.id.used_for_package_name_retrieval); 
int id = res.getIdentifier("some_drawable", "drawable", packageName); 
+0

Я не понимаю эту реализацию, разве вам не нужно знать пакет R, чтобы импортировать его в java-файл? Если нет, вы не можете его скомпилировать – tik27

2

Я не верю, что существует способ перечислить идентификаторы пакетов в Resources, но вы всегда можете использовать getResourceTypeName() с известным значением R, чтобы получить имя пакета. Что-то вроде:

String packageName = res.getResourcePackageName(R.drawable.ic_launcher); 
res.getIdentifier("name", "type", packageName); 

Я понимаю, что это не является идеальным, поскольку он требует, чтобы передать известный идентификатор ресурса первого, но это может быть единственным вариантом.

+0

http://www.piwai.info/renaming-android-manifest-package упоминает эту идею. Я даю вам преимущество, но не считая правильным, потому что это не то, что мне нужно. –

+0

@HeathBorders - учитывая, что вы только что отредактировали эту же функциональность в своем собственном ответе, вам не кажется, что вы должны дать Devunwired принять кредит за предложение? –

+0

Я уже знал об этом решении, и это был не тот ответ, который я искал с этим вопросом. Это обходной путь. Я дал ему верх. Возможно, мне следовало добавить эту ссылку в мой вопрос, так как я уже знал об этом. Ответ, который я нашел в google, был прав. Это невозможно. –

Смежные вопросы