如何获取具有已知资源名称的资源ID?
我想通过它的名字而不是它的int id来访问像String或者Drawable这样的资源。
我将使用哪种方法?
它会是这样的:
R.drawable.resourcename
确保你没有导入Android.R
命名空间,因为它可以混淆Eclipse(如果这就是你使用的)。
如果这不起作用,你总是可以使用上下文的getResources
方法…
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
如果this.context
被初始化为Activity
, Service
或任何其他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
- 看reflection和字段可访问性
- 不必要的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()); } }