Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 以编程方式设置R.ID_Android_Xml Parsing - Fatal编程技术网

Android 以编程方式设置R.ID

Android 以编程方式设置R.ID,android,xml-parsing,Android,Xml Parsing,我从下载了一个,它类似于谷歌地图对象,或者至少这就是我使用它的目的 它解析一个XML文件,其中列出了屏幕上应该可以触摸的区域,然后使用此方法创建这些区域。 这里是上下文,我已经注释掉了部分代码,并添加了我自己的代码来尝试解决我的问题 private Area addShape( String shape, String name, String coords, String id) { Log.v("IDS:", "id was "+id); Area a

我从下载了一个,它类似于谷歌地图对象,或者至少这就是我使用它的目的

它解析一个XML文件,其中列出了屏幕上应该可以触摸的区域,然后使用此方法创建这些区域。 这里是上下文,我已经注释掉了部分代码,并添加了我自己的代码来尝试解决我的问题

private Area addShape( String shape, String name, String coords, String id) {   
        Log.v("IDS:", "id was "+id);
        Area a = null;
        String rid = id.replace("@+id/", "");
        Log.v("IDS:", "rid was "+rid);

        // Generate a new ID for the area.
        int _id = 1;
        View vi = findViewById(_id);
        while (vi!=null) {
            _id++;
            vi = findViewById(_id);
        }

                //View.generateViewId(); //=0;
        Log.v("IDS:", "After conversion final time "+_id);
        /*
        try {
            Class<R.id> res = R.id.class;
            Field field = res.getField(rid);    // eg. rid = area10
            _id = field.getInt(null);
            Log.v("IDS:", "After conversion "+_id);
        }
        catch (Exception e) {
           _id = 0;
           Log.e("Exception ",e.getMessage());
        } finally {
            Log.v("IDS:", "After conversion final time "+_id);
        }
        */
        if (_id != 0) {
            if (shape.equalsIgnoreCase("rect")) {
                String[] v = coords.split(",");
                if (v.length == 4) {
                    a = new RectArea(_id, name, Float.parseFloat(v[0]),
                            Float.parseFloat(v[1]),
                            Float.parseFloat(v[2]),
                            Float.parseFloat(v[3]));
                }
            } 
            if (shape.equalsIgnoreCase("circle")) {
                String[] v = coords.split(",");
                if (v.length == 3) {
                    a = new CircleArea(_id,name, Float.parseFloat(v[0]),
                            Float.parseFloat(v[1]),
                            Float.parseFloat(v[2])
                            );
                }
            } 
            if (shape.equalsIgnoreCase("poly")) {               
                a = new PolyArea(_id,name, coords);                     
            } 
            if (a != null) {
                addArea(a);
            }
        } else {
            Log.v("Loading ID: ","_id was 0");
        }
        return a;
    }
private Area addShape(字符串形状、字符串名称、字符串坐标、字符串id){
Log.v(“id:”,“id是”+id);
a区=零;
字符串rid=id.replace(“@+id/”,“”);
Log.v(“id:”,“rid was”+rid);
//为该区域生成一个新ID。
int _id=1;
视图vi=findViewById(_id);
while(vi!=null){
_id++;
vi=findViewById(_id);
}
//View.generateView();/=0;
Log.v(“id:”,“转换后最后一次”+_id);
/*
试一试{
等级res=R.id.Class;
Field=res.getField(rid);//例如rid=area10
_id=field.getInt(null);
Log.v(“id:”,“转换后”+_id);
}
捕获(例外e){
_id=0;
Log.e(“异常”,e.getMessage());
}最后{
Log.v(“id:”,“转换后最后一次”+_id);
}
*/
如果(_id!=0){
if(shape.equalsIgnoreCase(“rect”)){
字符串[]v=coords.split(“,”);
如果(v.length==4){
a=新的矩形区域(_id,name,Float.parseFloat(v[0]),
Float.parseFloat(v[1]),
Float.parseFloat(v[2]),
Float.parseFloat(v[3]);
}
} 
if(形状等信号情况(“圆”)){
字符串[]v=coords.split(“,”);
如果(v.length==3){
a=新的CircleArea(_id,name,Float.parseFloat(v[0]),
Float.parseFloat(v[1]),
Float.parseFloat(v[2])
);
}
} 
if(shape.equalsIgnoreCase(“poly”){
a=新的多区域(_id、名称、坐标);
} 
如果(a!=null){
a区(a);
}
}否则{
Log.v(“加载ID:”,“\u ID为0”);
}
返回a;
}
不幸的是,屏幕上没有呈现任何内容,这是因为_id=0。应使用以下代码位对此进行更改:

   try {
                Class<R.id> res = R.id.class;
                Field field = res.getField(rid);    // eg. rid = area10
                _id = field.getInt(null);
            }
试试看{
等级res=R.id.Class;
Field=res.getField(rid);//例如rid=area10
_id=field.getInt(null);
}

尽管我不确定它是如何尝试和调试的,但有人能解释一下这个代码段在做什么吗?

R是一个只读类。它是在编译时生成的,您不应该使用反射来修改它的字段。此外,访问字段值时应避免反射。您应该使用官方API

类第一行的注释是

/* AUTO-GENERATED FILE.  DO NOT MODIFY. */ 

嗯,就个人而言,这些代码的格式太差了,我觉得很难阅读,更不用说弄清楚它应该做什么了。请给我们一个正确格式化的机会。已经完成-我无意中点击了块注释而不是代码部分。在参考资料类中,您有getIdentifier()方法,您可以使用该方法通过名称获取idgetIdentifier(“id”,“area10”,context.getPackage())。更改您的xml文件以提供id,如
id=“@+id/z1”
,而不仅仅是一个数字(如现在的
id=“@+id/1”
),因为系统将无法解析/生成字段名中的id(在java中,变量名不能以数字开头)。最后一段代码是什么?它使用反射从
R.id
类中获取字段值。这是我下载的类中的代码,不起作用。我想弄清楚的是它实际上在做什么,这样我就可以重做它了。你想实现什么