Android 以编程方式设置R.ID
我从下载了一个,它类似于谷歌地图对象,或者至少这就是我使用它的目的 它解析一个XML文件,其中列出了屏幕上应该可以触摸的区域,然后使用此方法创建这些区域。 这里是上下文,我已经注释掉了部分代码,并添加了我自己的代码来尝试解决我的问题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
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()
方法,您可以使用该方法通过名称获取id
:getIdentifier(“id”,“area10”,context.getPackage())
。更改您的xml文件以提供id,如id=“@+id/z1”
,而不仅仅是一个数字(如现在的id=“@+id/1”
),因为系统将无法解析/生成字段名中的id(在java中,变量名不能以数字开头)。最后一段代码是什么?它使用反射从R.id
类中获取字段值。这是我下载的类中的代码,不起作用。我想弄清楚的是它实际上在做什么,这样我就可以重做它了。你想实现什么