Android:按名称获取自定义xml类对象的资源ID

时间:2012-10-08 01:28:12

标签: android android-xml android-resources

我的“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>,以便我以后可以搜索它们?

感谢您的帮助!

3 个答案:

答案 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。