如何获取具有已知资源名称的资源ID?

我想通过它的名字而不是它的int id来访问像String或者Drawable这样的资源。

我将使用哪种方法?

它会是这样的:

R.drawable.resourcename

确保你没有导入Android.R命名空间,因为它可以混淆Eclipse(如果这就是你使用的)。

如果这不起作用,你总是可以使用上下文的getResources方法…

 Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource); 

如果this.context被初始化为ActivityService或任何其他Context子类。

更新:

如果它是你想要的名字,那么Resources类(由getResources()返回)有一个getResourceName(int)方法和一个getResourceTypeName(int)

更新2

Resources类有这个方法:

 public int getIdentifier (String name, String defType, String defPackage) 

它返回指定资源名称的整数,types和包。

如果我理解正确,这就是你想要的

 int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName()); 

凡“这”是一个活动,书面只是为了澄清。

如果您想在strings.xml中使用string或UI元素的标识符,请使用“drawable”

 int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName()); 

我警告你,这种获取标识符的方法非常慢,只能在需要的地方使用。

链接到官方文档: Resources.getIdentifier(string名称,stringdefType,stringdefPackage)

 int resourceID = this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName()); 

从string获取资源ID的简单方法。 在这里,resourceName是在XML文件中包含的可绘制文件夹中的资源ImageView的名称。

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

我会build议你使用我的方法来获取资源ID。 与使用getIdentidier()方法相比,效率更高。

代码如下:

 /** * @author Lonkly * @param variableName - name of drawable, eg R.drawable.<b>image</b> * @param с - class of resource, eg R.drawable.class or R.raw.class * @return integer id of resource */ public static int getResId(String variableName, Class<?> с) { Field field = null; int resId = 0; try { field = с.getField(variableName); try { resId = field.getInt(null); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } return resId; } 

我发现这个类对处理资源非常有帮助。 它有一些定义的方法来处理维度,颜色,绘制和string,就像这样:

 public static String getString(Context context, String stringId) { int sid = getStringId(context, stringId); if (sid > 0) { return context.getResources().getString(sid); } else { return ""; } } 

除了@lonkly解决scheme

  1. 看reflection和字段可访问性
  2. 不必要的variables

方法:

 /** * lookup a resource id by field name in static R.class * * @author - ceph3us * @param variableName - name of drawable, eg R.drawable.<b>image</b> * @param с - class of resource, eg R.drawable.class or R.raw.class * @return integer id of resource */ public static int getResId(String variableName, Class<?> с) throws android.content.res.Resources.NotFoundException { try { // lookup field in class java.lang.reflect.Field field = с.getField(variableName); // always set access when using reflections // preventing IllegalAccessException field.setAccessible(true); // we can use here also Field.get() and do a cast // receiver reference is null as it's static field return field.getInt(null); } catch (Exception e) { // rethrow as not found ex throw new Resources.NotFoundException(e.getMessage()); } }