2016-09-18 109 views
0

在不同的情况下,这个问题已经有很多问题,但是一天之后我找不到解决我的错误的答案。使用XmlPullParser解析android XML布局文件

我在res/layout文件夹内有一个名为activity_single_touch.xml的xml文件。 此文件用于添加按钮等视图,但我也希望能够将其“实时”编辑(用户可以在屏幕上绘制)。

继Android的引导,我想在我的主Java代码中使用XmlPullParser像这样:

public class SingleTouchActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // setContentView(R.layout.activity_single_touch); 
     XmlPullParser parser = getResources().getXml(R.xml.activity_single_touch); 
     AttributeSet attributes = Xml.asAttributeSet(parser); 
     setContentView(new SingleTouchEventView(this, attributes)); 
    } 

    public class SingleTouchEventView extends View { 
     ... 
    } 
} 

代码的其余部分使用OnDrawOnTouchEvent根据用户的移动绘制路径,然后无效。

我现在得到的错误是“无法解析符号'xml'”。 我该如何解决这个问题?

PS: 事情我已经尝试(和失败): 使用

XmlPullParser parser =getResources().getXml(R.layout.activity_single_touch); 

并得到 “预期的XML元素” 的错误,

我已经读了

this guide
these answeres
these as well
use of streams
use of context
moving the xml file to a different folder(could not move it)
this guide

当然搜索谷歌和一些StackOverflow的问题和答案的和。

回答

0

您可以使用getLayout方法打开布局文件并解析它。这是你如何手动解析它。

试试这个,在你的代码

try { 
    XmlResourceParser parser = getResources().getLayout(R.layout.activity_single_touch); 
    int event = parser.getEventType(); 
    do{ 
     String tagName = parser.getName(); 
     if(event == XmlPullParser.START_TAG){ 
      Log.e("TagName", tagName); 
     } 
     event = parser.next(); 
    } while (event != XmlPullParser.END_DOCUMENT); 
} catch (XmlPullParserException e) { 
    e.printStackTrace(); 
} catch (Exception e){ 
    e.printStackTrace(); 
} 

用法,

public class SingleTouchActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     try { 
      XmlResourceParser parser = getResources().getLayout(R.layout.activity_single_touch); 
      AttributeSet attributes = Xml.asAttributeSet(parser); 
      setContentView(new SingleTouchEventView(this, attributes)); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public class SingleTouchEventView extends View { 

    } 
} 
+0

我不知道你要我怎么用这个 - 我试图改变这一行: XmlPullParser解析器= getResources ().getXml(R.xml.activity_single_touch); 到你给我的代码块,它不起作用。 我也尝试将此行切换为: XmlResourceParser parser = getResources()。getLayout(R.layout.activity_single_touch); 并没有奏效。 我在做什么错? – yo1122

+0

你的意思是什么不起作用? “TagName”是否未被打印? –

+0

首先 - 它告诉我这一行: AttributeSet attributes = Xml.asAttributeSet(parser); “无法解析符号”解析器“”。我认为这是范围问题,所以我将代码的前几行更改为: XmlResourceParser解析器; 尝试解析器= getResources()。getLayout(R.layout。activity_main); ... 但是它说“变量”解析器可能没有被初始化“。 我该怎么办? 顺便说一句 - 为了确保我在正确的位置使用此代码,这是所有的OnCreate方法,而不是上面的评论中引用的行。 – yo1122