Android, получить идентификатор ресурса из строки? - PullRequest
137 голосов
/ 13 декабря 2010

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

Например:

R.drawable.icon

Мне нужно получить целочисленный идентификатор этого, но мне также нужен доступ к строке "icon".

Было бы предпочтительнее, если бы все, что мне пришлось передать методу, это строка "icon".

Ответы [ 14 ]

149 голосов
/ 13 декабря 2010

@ EboMike: я не знал, что Resources.getIdentifier() существует.

В своих проектах я использовал для этого следующий код:

public static int getResId(String resName, Class<?> c) {

    try {
        Field idField = c.getDeclaredField(resName);
        return idField.getInt(idField);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

Он будет использоваться следующим образомдля получения значения R.drawable.icon целочисленного значения ресурса

int resID = getResId("icon", R.drawable.class); // or other resource class

Я только что нашел сообщение в блоге, в котором говорится, что Resources.getIdentifier() медленнее, чем использование отражения, как я. Проверьте это .

70 голосов
/ 30 сентября 2013

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

public static int getResourceId(String pVariableName, String pResourcename, String pPackageName) 
{
    try {
        return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

Поэтому, если вы хотите получить drawable , вызовите функцию, подобную этой,

getResourceId("myIcon", "drawable", getPackageName());

идля строки вы можете назвать это так

getResourceId("myAppName", "string", getPackageName());

Читать это

36 голосов
/ 12 июля 2013

Это основано на ответе @Macarse.

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

public static int getId(String resourceName, Class<?> c) {
    try {
        Field idField = c.getDeclaredField(resourceName);
        return idField.getInt(idField);
    } catch (Exception e) {
        throw new RuntimeException("No resource ID found for: "
                + resourceName + " / " + c, e);
    }
}

Пример:

getId("icon", R.drawable.class);
29 голосов
/ 12 апреля 2012

Как получить приложение идентификатор ресурса из имени ресурса - довольно распространенный и хорошо отвеченный вопрос.

Как получить собственный Android идентификатор ресурса из имени ресурса, ответ на который не так хорош. Вот мое решение получить Android-ресурс для рисования по имени ресурса:

public static Drawable getAndroidDrawable(String pDrawableName){
    int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "android");
    if(resourceId==0){
        return null;
    } else {
        return Resources.getSystem().getDrawable(resourceId);
    }
}

Метод можно изменить для доступа к другим типам ресурсов.

10 голосов
/ 15 мая 2011

Если вам нужно соединить строку и int, тогда как насчет Map?

static Map<String, Integer> icons = new HashMap<String, Integer>();

static {
    icons.add("icon1", R.drawable.icon);
    icons.add("icon2", R.drawable.othericon);
    icons.add("someicon", R.drawable.whatever);
}
9 голосов
/ 13 декабря 2010

Вы можете использовать Resources.getIdentifier(), хотя вам нужно использовать формат для вашей строки, как вы используете ее в XML-файлах, то есть package:drawable/icon.

5 голосов
/ 26 июля 2013

Мне так понравилось, у меня работает:

    imageView.setImageResource(context.getResources().
         getIdentifier("drawable/apple", null, context.getPackageName()));
4 голосов
/ 27 апреля 2015

Простой способ получения идентификатора ресурса из строки.Здесь resourceName - это имя ресурса ImageView в папке для рисования, которое также включено в XML-файл.

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
ImageView im = (ImageView) findViewById(resID);
Context context = im.getContext();
int id = context.getResources().getIdentifier(resourceName, "drawable",
context.getPackageName());
im.setImageResource(id);
3 голосов
/ 09 октября 2017
public int getDrawableName(Context ctx,String str){
    return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());

}
3 голосов
/ 02 августа 2014

Поскольку вы сказали, что хотите передать только один параметр, и не важно, какой, вы можете передать идентификатор ресурса и затем найти для него строковое имя, таким образом:

String name = getResources().getResourceEntryName(id);

Это может быть наиболее эффективным способом получения обоих значений. Вам не нужно возиться, находя только часть «иконки» из более длинной строки.

...