我的“res”文件夹中有自定义文件夹,文件和自定义XML资源类。
我创建了一些自定义对象,我称之为:
<area id="@+id/someId" name="Some Name" />
我可以通过R.id.someId静态访问它们。
但是,我需要在运行时获取资源ID,我需要通过“名称”来实现。换句话说,我在列表中显示“Some Name”,我需要知道用户从ListView中选择“Some Name”。 (我不寻找ListItem的id,我实际上想搜索我的资源并获取区域xml对象的id)
例如:
我想做以下事情:
int id = getIdFromResourceName("Some Name");
这可能吗?
我尝试过使用:
int i = this.getResources().getIdentifier("Some Name", "area", this.getPackageName());
......但这似乎不起作用。我总是得到0。
修改
如下面Geobits所建议的,有没有办法从res文件中加载所有资源并将它们保存在数组/地图中,例如Map<id,name>
,以便我以后可以搜索它们?
感谢您的帮助!
答案 0 :(得分:2)
我不确定这是否是你需要的。但这是我的解决方案提案。如果您的资源是可绘制的,我就是这样做的:
public int findResourceIdByName(String name) {
Field[] fields = R.drawable.class.getFields(); // get all drawables
try {
for(int i=0; i<fields.length; i++) { // loop through all drawable resources in R.drawable
int curResId = fields[i].getInt(R.drawable.class); // Returns the value of the field in the specified object as an int.
//This reproduces the effect of object.fieldName
Drawable drawable = getResources().getDrawable(R.drawable.icon); // get the Drawable object
if(drawable.getName().equals(name)) { //getName() is NOT possible for drawable, this is just an example
return curResId; // return the corresponding resourceId
// or you could return the drawable object instead,
// depending on what you need.
}
}
return -1; // no ResourceId found for this name
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
这是使用Reflection,因此它不是最有效的方法。如果经常调用此方法,则可能需要缓存
的结果Field[] fields = R.drawable.class.getFields();
至少。
答案 1 :(得分:1)
请改为尝试:
int i = this.getResources().getIdentifier("someId", "id", this.getPackageName());
它想要的defType
是什么形式的标识符。由于它是R.id.someId
,您需要id
。如果是R.drawable.someDrawable
,则使用drawable
。
答案 2 :(得分:0)
尝试使用,
int resID=getResources().getIdentifier("name", "id", getPackageName());
获取资源的ID。