一种使用Xml对Android界面进行动态布局的方法

前端之家收集整理的这篇文章主要介绍了一种使用Xml对Android界面进行动态布局的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


动态布局还是先从我们的需求出发,近期做的一个项目中提到了了一个需求:

需要动态的生成一个表单,表单中的标题、选项、提示文字等都是可以动态的增加删除的,而且动态的配置文件是xml文件

我们在写html的使用常常就用如此的方式来制作配置自己的html页面,因为接到这个需求的时候正是该网站向拓展自己的无线业务,故此,直接将自己的网页端应用数据与无线端绑定到一起去了。

如:

  1. <!-- 机械 -->
  2. <machine>
  3. <hint>请简单描述机械综合状况。。。如:启动车辆,发动机运转正常,怠速平稳无异响,行驶过程中转向、制动良好。</hint>
  4. <question>
  5. <title>发动机</title>
  6. <option>运转正常</option>
  7. <option>轻微异响</option>
  8. <option>异响</option>
  9. </question>
  10. <question>
  11. <title>变速箱</title>
  12. <option>怠速平稳</option>
  13. <option>轻微冲档</option>
  14. <option>冲档</option>
  15. </question>
  16. <question>
  17. <title>刹车制动</title>
  18. <option>良好</option>
  19. <option>一般</option>
  20. <option>需要修理</option>
  21. </question>
  22. <question>
  23. <title>引擎箱</title>
  24. <option>清洁</option>
  25. <option>轻微渗油</option>
  26. <option>室盖渗油</option>
  27. </question>
  28. </machine>


我们希望解析此段xml数据能够得到与网站类似的界面

分析

Android的界面布局就是有N多个layout.xml组成的。所以,解析xml对于Android系统来说是完全可行的。

在移动Android平台上我们能够用SimpleAPIforXML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件

1. SAX解析XML文件

SAX是一个解析速度快并且占用内存少的xml解析器,采用的是事件驱动,非常适合用于Android等移动设备。

2. DOM解析XML文件

DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观。

3.Pull解析与SAX类似

实际上我们使用的是一个开源的Html、Xml解析器Jsoup。jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。最主要的原因是,开源小巧,我们可以方便的移植到后代的Jsp服务端去。

Jsoup的使用也比较简单,可以去到官网:http://jsoup.org/看看简单的demo就会了。下面是我用Jsoup解析之前的xml代码段。


  1. public Questions getData(String tagName)
  2. {
  3. AssetManager am = null;
  4. am = m_context.getAssets();
  5.  
  6. try
  7. {
  8. //打开Assets文件夹下的 question.xml文件 获得输入流
  9. inputStream = am.open(Constant.QUESTION_XML_PATH);
  10. }
  11. catch (Exception e)
  12. {
  13. e.printStackTrace();
  14. }
  15. Questions questionList = new Questions(m_context);
  16. Question question = null;
  17. Document doc = null;
  18. try
  19. {
  20. //使用Jsoup载入xml文件中的数据,默认编码UTF-8
  21. doc = Jsoup.parse(inputStream,"UTF-8","");
  22. }
  23. catch (IOException e1)
  24. {
  25. e1.printStackTrace();
  26. }
  27. //得到首个元素
  28. Element element = doc.select(tagName).first();
  29. //得到<hint></hint>中的值
  30. String hint = element.getElementsByTag("hint").html();
  31. questionList.setHint(hint);
  32. //获取每一个<question>中的数据,并且打包为question 类
  33. Elements qElements = element.getElementsByTag("question");
  34. for (Element e : qElements)
  35. {
  36. question = new Question();
  37. Elements optionElements = e.getAllElements();
  38. for (Element op : optionElements)
  39. {
  40. String name = op.tagName();
  41. //获取<title></title>中的值
  42. if ("title".equalsIgnoreCase(name) )
  43. question.setTitle(op.html());
  44. //将多个<option>添加如列表
  45. else if ("option".equalsIgnoreCase(name))
  46. {
  47. if (question.options == null)
  48. question.options = new ArrayList<String>();
  49. question.options.add(op.html());
  50. }
  51. }
  52. if (questionList.questions == null)
  53. questionList.questions = new ArrayList<Question>();
  54. questionList.questions.add(question);
  55. }
  56. close();
  57. return questionList;
  58. }

而question类中我们只需要存储几个较为简单的数据就可以了。


  1. /**
  2. * @author zhoushengtao
  3. * @since 2013-6-26 上午9:36:17
  4. */
  5.  
  6. package com.stchou.paiche.pojo;
  7.  
  8. import java.util.ArrayList;
  9.  
  10. public class Question
  11. {
  12. private String title;
  13. private String select = "";//存储选择的结果,方便输出
  14. public ArrayList<String> options = new ArrayList<String>();
  15.  
  16. public String getTitle()
  17. {
  18. return this.title;
  19. }
  20.  
  21. public void setTitle(String title)
  22. {
  23. this.title = title;
  24. }
  25.  
  26. public String getSelect()
  27. {
  28. return this.select;
  29. }
  30.  
  31. public void setSelect(String select)
  32. {
  33. this.select = select;
  34. }
  35.  
  36. public int getPosition()
  37. {
  38. for(int i=0;i<options.size();i++)
  39. if(options.get(i).equals(select))
  40. return i;
  41. return 0;
  42. }
  43. @Override
  44. public String toString()
  45. {
  46. if (select.length() == 0)
  47. select = options.get(0);
  48. String textString = "<question>\n";
  49. textString += "<title>" + title + "</title>\n";
  50. if (options != null)
  51. for (String text : options)
  52. textString += "<option>" + text + "</option>\n";
  53. textString += "<selected>" + select + "</selected>\n";
  54. textString += "</question>\n";
  55. return textString;
  56. }
  57.  
  58. }



获得了我们根据xml解析来的数据之后再界面上的布局就很简单了,但是值得注意的是,我们平时使用的是layout.xml文件针对Android的Activity来布局,这里我们获得的是Question类,只能在代码中给其进行布局。这个没有一个所见即所得的界面写起来还是有点吃力。所以,根据布局还是的分析好自己的布局方式,在layout中写写,看看出来的效果,再从代码上各具xml自动生成的布局方式去布局,这样做起来比较简单。

效果

猜你在找的XML相关文章