Android, получив идентификатор ресурса из строки?

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

Например:

R.drawable.icon 

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

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

Solutions Collecting From Web of "Android, получив идентификатор ресурса из строки?"

@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; } } 

Он будет использоваться следующим образом:

 getResId("icon", Drawable.class); 

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

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

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

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

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

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

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

Прочитай это

Это основано на ответе @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); 

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

Как получить собственный идентификатор ресурса 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); } } 

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

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

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

 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); } 

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

  imageView.setImageResource(context.getResources(). getIdentifier("drawable/apple", null, context.getPackageName())); 

Простой способ получить идентификатор ресурса из строки. Здесь 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); 

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

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

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

В MonoDroid / Xamarin.Android вы можете делать:

  var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName); 

Но поскольку GetIdentifier не рекомендуется в Android – вы можете использовать Reflection следующим образом:

  var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null); 

Где я предлагаю поставить try / catch или проверить строки, которые вы передаете.

Для получения идентификатора Drawable id из имени ресурса String я использую этот код:

 private int getResId(String resName) { int defId = -1; try { Field f = R.drawable.class.getDeclaredField(resName); Field def = R.drawable.class.getDeclaredField("transparent_flag"); defId = def.getInt(null); return f.getInt(null); } catch (NoSuchFieldException | IllegalAccessException e) { return defId; } }