【问题标题】:Parse an android XML layout file using XmlPullParser使用 XmlPullParser 解析 android XML 布局文件
【发布时间】:2017-01-26 06:47:58
【问题描述】:

这个问题在不同的情况下被问过很多次,但是一天多来我都找不到解决我错误的答案。

我在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 {
        ...
    }
}

其余代码使用OnDraw和OnTouchEvent根据用户移动绘制路径,然后失效。

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

附注: 我尝试过的事情(并且失败了): 使用

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

当然还有搜索 google 和更多 stackOverflow 问题和答案。

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以使用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 {
    
        }
    }
    

    【讨论】:

    • 我不确定您希望我如何使用它 - 我尝试更改此行: XmlPullParser parser = getResources().getXml(R.xml.activity_single_touch);到你给我的代码块,它没有用。我还尝试将此行切换为: XmlResourceParser parser = getResources().getLayout(R.layout.activity_single_touch);它没有用。我做错了什么?
    • 它不起作用是什么意思? TagName 没有打印出来吗?
    • 首先 - 它在这一行告诉我: AttributeSet attributes = Xml.asAttributeSet(parser); “无法解析符号‘解析器’”。我认为这是范围的问题,所以我将代码的前几行更改为: XmlResourceParser parser ;尝试 { parser = getResources().getLayout(R.layout.activity_main); ...但是它说“变量'解析器'可能没有被初始化”。我还应该做什么?顺便说一句 - 只是为了确保我在正确的位置使用此代码,这全部在 OnCreate 方法中,而不是在上述注释中引用的行。
    • 我在我的代码中做了,我问了几次你的意思是我只是把我的代码的那一行改成你给我的这个块并保留其余的,否则我不知道怎么做使用这个块。否则我该如何使用这个解析器?如何实现它,以便 ui 包含 java 文件中的 SingleTouchEventView 和 xml 文件中的不同视图?
    • 编译没有错误,但我无法从我的 xml 视图中看到该按钮.. 我只能在一个空白屏幕上绘制 (SingleTouchEventView)。也许我需要在 xml 代码中添加一些东西?我将在我的问题中添加前几行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多