Як отримати ідентифікатор ресурсу зображення, якщо я знаю його ім'я?


Відповіді:


269

Щось таке:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
Дякую, що допомогло мені знайти рішення подібної проблеми! Я використаю, getResources().getIdentifier(name, "id", getPackageName());щоб отримати ідентифікатор ImageButton (як це було б з R.id.name).
Select0r

42
Зауважте, що назва, яке можна
малювати,

1
що саме йде в змінній name? Я хочу знайти ідентифікатор кнопки, посилання на яку я знаю, в моєму випадку цеbutton1
Джон Уотсон,

1
getResource()і getPackageName()відображається помилка. cannot resolve method
Srujan Barai

@Srujan Barai, getResource()і getPackageName()є методами діяльності.
Берга

29

Ви також можете спробувати це:

try {
    Class res = R.drawable.class;
    Field field = res.getField("drawableName");
    int drawableId = field.getInt(null);
}
catch (Exception e) {
    Log.e("MyTag", "Failure to get drawable id.", e);
}

Я скопіював цей вихідний код із нижньої URL-адреси. На основі тестів, зроблених на цій сторінці, це в 5 разів швидше, ніж getIdentifier (). Я також вважав його більш зручним та простим у використанні. Сподіваюся, це допоможе і вам.

Посилання: динамічне отримання ресурсів в Android


2
це може бути швидше, але я виявив, що це може привести до неприємностей, якщо ви використовуєте proguard. Принаймні для мене це не спрацьовувало
Педро Райньо

Ловля загальних винятків - особливо погана ідея. Крім того, зауважте, що якщо немає чітких посилань на тематичне зображення, Proguard може оптимізувати посилання, оскільки він не вірить, що він використовується де-небудь.
Пол Ламмерцма

Я зараз розумію :) Ви маєте на увазі, що під час оптимізації зміни DravableName і ресурс неможливо знайти за допомогою цього методу, якщо я правий? :)
VSB

1
@VSB: якщо ваш останній коментар є відповіддю на коментар Пола Ламмертсма безпосередньо вище: Ні, він означає, що Proguard не знає, що це посилання на ресурс, і тому він може видалити ресурс, вважаючи, що він не використовується.
ToolmakerSteve

щойно ви використовуєте xxxxhdpi, xxhdpi тощо. Цей метод стає менш корисним
хтось десь

11

Приклад ресурсу публічної системи:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

оповіщення

Інший спосіб - направити документацію на клас android.R.dravable .


1
@Milaaaad що ти маєш на увазі?
naXa

це означає, що я заплутався в ресурсах у коді, і я використовую його в класі не активності
Milaaaad

1
@Milaaaad Цей метод призначений для системних ресурсів. Вони не залежать від контексту.
naXa

10

Ви можете використовувати цю функцію для отримання ідентифікатора ресурсу:

public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
    try {
        return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        throw new RuntimeException("Error getting Resource ID.", e)
    } 
}


Отже, якщо ви хочете отримати ідентифікатор ресурсу, який можна отримати , ви можете викликати такий спосіб:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(або з фрагмента):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


Для ідентифікатора рядкового рядка ви можете назвати його так:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

тощо ...


Обережно : він кидає RuntimeException, якщо не вдається знайти ідентифікатор ресурсу. Не забудьте належним чином відновити виробництво.

Прочитай це


4
Я думаю, що потрібно зняти staticз цього, інакше getResources()не вийде.
Річард Ле Месюр'є

@ Richard Le Mesurier, ти можеш пояснити, чому? Дякую.
Веер

1
@ Leo.Han На той момент, коли я робив цей коментар, цей файл Contextбув недоступний. Виправлення було або видалити staticі перемістити його в Context(наприклад, Activityабо Application); або альтернативне виправлення - це те, що зробив Джонатан у своїй редакції, а це перейти Contextдо методу.
Річард Ле Месюр'є

1
@ Richard Le Mesurier, я перевірив історію редагування саме зараз, це так само, як ви сказали, дякую за люб'язну відповідь через стільки років :)
Вересень

0

Ще один сценарій, з яким я стикався.

String imageName = "Привіт", і тоді, коли він буде переданий у функцію getIdentifier як перший аргумент, він передасть ім'я із завершенням нульового рядка і завжди поверне нуль. Передайте це зображенняName.substring (0, imageName.length () - 1)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.