Android – получить идентификатор ресурса из другого ресурса

Скажем, у меня есть drawable :

foo.png

В определенный момент в моей программе она получает один из двух возможных строковых ключей: «img_foo1» или «img_foo2», которые я хочу использовать для получения того же самого «foo», который можно нарисовать.

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

<drawable name="img_foo1">@drawable/foo</drawable>
<drawable name="img_foo2">@drawable/foo</drawable>

Затем я подумал, что могу использовать getResources().getIdentifier() с этими именами ключей, однако это дает мне идентификатор img_foo1 и img_foo2, но не идентификатор drawable foo.

Есть ли способ получить идентификатор ресурса, на который ссылаются эти ресурсы?

изменить:

Причина, по которой я это делаю, заключается в том, что я получаю эти ключи из внешнего источника, который я не могу контролировать. Единственное, что я могу сделать, это как-то сопоставить известные ключи с соответствующими чертежами, чтобы нарисовать правильное изображение (поскольку одно и то же изображение может использоваться разными ключами).

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


person htafoya    schedule 06.07.2012    source источник


Ответы (3)


Используйте getValue(), передавая false в качестве последнего параметра. Думаю, теперь вы получите ссылку на @drawable/foo в TypedValue, чей идентификатор вы теперь можете получить. я не пробовал; дайте мне знать, если вы дадите ему шанс.

person Dheeraj Vepakomma    schedule 06.07.2012
comment
хорошо, сработало очень хорошо. имя должно быть (getPackage() + ":drawable" + key), а значение внутри typedValue.data, если кому интересно. - person htafoya; 11.07.2012

Можете ли вы объяснить немного больше о том, почему вы пытаетесь сделать что-то таким образом? Обычно вы вообще не используете строку. Кроме того, я не знаком с использованием подобных рисунков.

Насколько я знаю, вы хотите просто иметь один рисунок, который называется foo.png. Если вы хотите использовать это в различных макетах, это нормально — просто используйте изображения. Для всех ресурсов вам потребуется отслеживать целочисленные значения в программе (R.drawable.foo и т. д.).

person Mark D    schedule 06.07.2012

Ну, не совсем чистый, но тем временем мне удалось получить выпадающий идентификатор с помощью этого:

int keyId = getResources().getIdentifier(key, "drawable", getPackageName());

int drawableId = getResources().getIdentifier(getString(keyId).replace("res/","").replace(".png",""),null,getPackageName());
person htafoya    schedule 06.07.2012