Спасибо, это помогло мне найти решение похожей проблемы! Я буду использовать getResources().getIdentifier(name, "id", getPackageName());для получения идентификатора ImageButton (как и в случае с R.id.name).
Select0r
42
Обратите внимание, что имя для рисования НЕ должно включать расширение типа ".png"
larham1
1
что именно входит в переменную name? Я хочу найти идентификатор кнопки, ссылку на которую я знаю, в моем случае этоbutton1
@Srujan Barai, getResource()и getPackageName()это методы из Activity.
Берга
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 (). Я также нашел его более удобным и простым в использовании. Надеюсь, это поможет и вам.
это может быть быстрее, но я обнаружил, что у вас могут возникнуть проблемы, если вы используете proguard. Это не сработало в Proguard, по крайней мере, для меня
Педро Рейнхо
Особенно плохая идея - перехват общих исключений. Кроме того, обратите внимание, что если нет жестких ссылок на drawable, Proguard может оптимизировать ссылку, поскольку не верит, что она где-либо используется.
Paul Lammertsma
Теперь я понимаю :) Вы имеете в виду, что во время оптимизации изменяется drawableName и ресурс не может быть найден с помощью этого метода, если я прав? :)
VSB
1
@VSB: если ваш последний комментарий является ответом на комментарий Пола Ламмерцма непосредственно выше: Нет, он означает, что Proguard не знает, что это ссылка на ресурс, и поэтому может удалить ресурс, полагая, что он не используется.
ToolmakerSteve
как только вы используете xxxxhdpi, xxhdpi и т. д., этот метод становится менее полезным
Someone Somewhere
11
Пример для общедоступного системного ресурса:
// this will get id for android.R.drawable.ic_dialog_alertint id =Resources.getSystem().getIdentifier("ic_dialog_alert","drawable","android");
Другой способ - обратиться к документации по классу android.R.drawable .
Думаю снимать нужно staticиз того, иначе getResources()не получится.
Ричард Ле Мезурье,
@ Ричард Ле Мезурье, вы можете объяснить, почему? Спасибо.
Вир
1
@ Leo.Han В то время, когда я делал этот комментарий, сайт Contextне был доступен. Исправление заключалось в том, чтобы удалить staticи переместить его в Context(например, Activityили Application); или альтернативное исправление - это то, что Джонатан сделал в своем редакторе, который должен был передать Contextметод.
Ричард Ле Мезурье
1
@Richard Le Mesurier, я только что проверил историю редактирования, это именно то, что вы сказали, спасибо за ваш любезный ответ после стольких лет :)
Veer
0
Еще один сценарий, с которым я столкнулся.
String imageName = "Hello", а затем, когда он передается в функцию getIdentifier в качестве первого аргумента, он передает имя с завершением строки нулем и всегда будет возвращать ноль. Передайте это imageName.substring (0, imageName.length () - 1)
Ответы:
Примерно так:
источник
getResources().getIdentifier(name, "id", getPackageName());
для получения идентификатора ImageButton (как и в случае с R.id.name).name
? Я хочу найти идентификатор кнопки, ссылку на которую я знаю, в моем случае этоbutton1
getResource()
иgetPackageName()
показывает ошибку.cannot resolve method
getResource()
иgetPackageName()
это методы из Activity.Вы также можете попробовать это:
Я скопировал этот исходный код из URL ниже. Согласно тестам, проведенным на этой странице, он в 5 раз быстрее, чем getIdentifier (). Я также нашел его более удобным и простым в использовании. Надеюсь, это поможет и вам.
Ссылка: динамическое получение ресурсов в Android
источник
Пример для общедоступного системного ресурса:
Другой способ - обратиться к документации по классу android.R.drawable .
источник
Вы можете использовать эту функцию для получения идентификатора ресурса:
Итак, если вы хотите получить идентификатор Drawable Resource ID, вы можете вызвать метод следующим образом:
(или из фрагмента):
Для идентификатора ресурса String вы можете назвать его так:
и т.д...
Осторожно : если не удается найти идентификатор ресурса, возникает исключение RuntimeException. Обязательно правильно восстановить в продакшене.
Прочитайте это
источник
static
из того, иначеgetResources()
не получится.Context
не был доступен. Исправление заключалось в том, чтобы удалитьstatic
и переместить его вContext
(например,Activity
илиApplication
); или альтернативное исправление - это то, что Джонатан сделал в своем редакторе, который должен был передатьContext
метод.Еще один сценарий, с которым я столкнулся.
String imageName = "Hello", а затем, когда он передается в функцию getIdentifier в качестве первого аргумента, он передает имя с завершением строки нулем и всегда будет возвращать ноль. Передайте это imageName.substring (0, imageName.length () - 1)
источник