Board logo

标题: 使用 Android 和 XML 构建动态用户界面(8) [打印本页]

作者: look_w    时间: 2018-9-19 20:23     标题: 使用 Android 和 XML 构建动态用户界面(8)

通过一个 DOM 解析器操作这个 XML 数据,提取表单和字段元素及属性并将它们分别存储在 XmlGuiForm 和 XmlGuiFormField 类的实例中。这个方法的主体用于解析和填充任务。
两种主要的 XML 解析方法是 DOM 和 SAX。DOM 解析器的工作原理是将一个文档解析到内存中,然后应用程序遍历一个 Document Object Model 树以访问 XML 中包含的各种数据元素。这里也可以使用 SAX 解析器,原因是您通过填充这两个类来构建您自己的文档表示。
这个应用程序的 DOM 方法的优势在于,它具有某种程度的程序性且比较容易跟随代码,而 SAX 方法则需要一些回调函数,回调函数中只存储想要的数据。在一些实例中,开发人员编写来实现回调函数的代码的复杂程度要比 DOM 方法高得多。由于 XML 数据在 DOM 方法中完全解析,因此更为内存密集。对于这个应用程序的目的,由于元数据表单非常小,DOM 的简单性和容易跟随的本质是比内存管理更大的驱动因素。
参见 ,获取关于在 Android 中编码 XML 解析器的一个优秀参考资料。
这个 XML 元数据表单已经转换为 Java 类实例,现在可以显示表单,以便从用户收集数据。
收集用户数据您已经创建了 Activity 主屏幕布局,现在可以创建用户界面表单来收集数据了。在本例中,您将创建一个 Robotics Club Registration 表单和一个 Auto Maintenance 调查表单。
使用元数据这个应用程序取决于 Android 程序员动态操作用户界面的能力。在本教程前面,您检查了 main.xml 文件,该文件定义 XmlGui 类(主 Activity)的屏幕布局。如果您总是必须在设计或编译时定义用户界面元素,那么应用程序几乎不可能是它的当前形式。
幸运的是,您并不局限于那种方式。DisplayForm() 方法负责将这个元数据转换为用户界面元素,以便搜集数据。其代码分为两个主要功能区域:用户界面元素的布局和提交按钮的处理。
首先,检查布局逻辑。这段代码负责将 XmlGuiForm 对象转换为一个真正的屏幕表单。 展示了这段代码。
清单 8. 布局逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
private boolean DisplayForm()
{

    try
    {
        ScrollView sv = new ScrollView(this);

    final LinearLayout ll = new LinearLayout(this);
    sv.addView(ll);
    ll.setOrientation(android.widget.LinearLayout.VERTICAL);

    // walk through the form elements and dynamically create them,
    // leveraging the mini library of tools.
    int i;
    for (i=0;i<theForm.fields.size();i++) {
        if (theForm.fields.elementAt(i).getType().equals("text")) {
                theForm.fields.elementAt(i).obj = new
                XmlGuiEditBox(this,(theForm.fields.elementAt(i).isRequired()
                ? "*" : "") + theForm.fields.elementAt(i).getLabel(),"");
                ll.addView((View) theForm.fields.elementAt(i).obj);
        }
        if (theForm.fields.elementAt(i).getType().equals("numeric")) {
                theForm.fields.elementAt(i).obj = new
                XmlGuiEditBox(this,(theForm.fields.elementAt(i).isRequired()
                ? "*" : "") + theForm.fields.elementAt(i).getLabel(),"");
                ((XmlGuiEditBox)theForm.fields.elementAt(i).obj).makeNumeric();
                ll.addView((View) theForm.fields.elementAt(i).obj);
        }
        if (theForm.fields.elementAt(i).getType().equals("choice")) {
                theForm.fields.elementAt(i).obj = new
                XmlGuiPickOne(this,(theForm.fields.elementAt(i).isRequired()
                ? "*" : "") + theForm.fields.elementAt(i).getLabel(),
                theForm.fields.elementAt(i).getOptions());
                ll.addView((View) theForm.fields.elementAt(i).obj);
        }
    }


    Button btn = new Button(this);
    btn.setLayoutParams(new LayoutParams
    (ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.
    WRAP_CONTENT));

    ll.addView(btn);

    btn.setText("Submit");
    btn.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            // check if this form is Valid
            if (!CheckForm())
            {
                AlertDialog.Builder bd = new AlertDialog.Builder(ll.getContext());
            AlertDialog ad = bd.create();
            ad.setTitle("Error");
            ad.setMessage("Please enter all required (*) fields");
            ad.show();
            return;

            }
            if (theForm.getSubmitTo().equals("loopback")) {
                // just display the results to the screen
                String formResults = theForm.getFormattedResults();
                Log.i(tag,formResults);
                AlertDialog.Builder bd = new AlertDialog.Builder(ll.getContext());
            AlertDialog ad = bd.create();
            ad.setTitle("Results");
            ad.setMessage(formResults);
            ad.show();
            return;

            } else {
                if (!SubmitForm()) {
                    AlertDialog.Builder bd = new AlertDialog.Builder(ll.getContext());
                AlertDialog ad = bd.create();
                ad.setTitle("Error");
                ad.setMessage("Error submitting form");
                ad.show();
                return;
                }
            }

        }
    } );

    setContentView(sv);
    setTitle(theForm.getFormName());

    return true;

    } catch (Exception e) {
        Log.e(tag,"Error Displaying Form");
        return false;
    }
}




您必须预期超出单个屏幕可以容纳的内容的更多字段的可用性,因此,使用一个 ScrollView 作为父视图或容器。在该 ScrollView 中,您使用一个垂直 LinearLayout 来将各种用户界面小部件组织为一个垂直列。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0