向日葵又名朝阳花,因其花常朝着太阳而得名。英语称之为sunflower却不是因为它的这一特性,因为其黄花开似太阳的缘故。16世纪~17世纪sunflower一词从拉丁语flos solis借译过来。向日葵的法语,意大利语和西班牙语名称tournesol,girasol和girasol同汉语名称一样,也是基于“向日”这一特性来命名的。
(3)创建javebean PlantInfo类
从plant.xml代码中可以看出,每种植物信息都包含name、content属性,为了方便后续的使用,可以将这两个属性封装成一个Javabean,具体代码如下所示:
1/**植物信息*/
1 public class PlantInfo {
2 private String plantName;
3 private String plantContent;
4 public String getPlantName() {
5 return plantName;
6 }
7 public void setPlantName(String plantName) {
8 this.plantName = plantName;
9 }
10 public String getPlantContent() {
11 return plantContent;
12 }
13 public void setPlantContent(String plantContent) {
14 this.plantContent = plantContent;
15}
16}
(4)创建工具类utils
为了代码的更加易于阅读,避免大量代码都在一个类中,因此创建一个用来解析XML文件的工具类utils。utils类中定义了一个getPlantsInfos()方法,该方法中包含了解析XML文件的逻辑代码,具体代码如下所示:
1/** 解析xml文件的工具类*/
17 public class utils {
18// 返回天气信息的集合
19 public static ListgetPlantInfos(InputStream is)
20 throws Exception {
21// 得到pull解析器
22 XmlPullParser parser = Xml.newPullParser();
23// 初始化解析器,第一个参数代表包含xml的数据
24 parser.setInput(is, 'utf-8');
25 ListplantInfos = null;
26 PlantInfo plantInfo = null;
27// 得到当前事件的类型
28 int type = parser.getEventType();
29// END_DOCUMENT文档结束标签
30 while (type != XmlPullParser.END_DOCUMENT) {
31 switch (type) {
32// 一个节点的开始标签
33 case XmlPullParser.START_TAG:
34// 解析到全局开始的标签infos根节点
35 if ('plants'.equals(parser.getName())) {
36 plantInfos = new ArrayList();
37 } else if ('plantsInfo'.equals(parser.getName())) {
38 plantInfo = new PlantInfo();
39 } else if ('name'.equals(parser.getName())) {
40// parset.nextText()得到该tag节点中的内容
41 String name = parser.nextText();
42 plantInfo.setPlantName(name);
43 } else if ('content'.equals(parser.getName())) {
44 String content = parser.nextText();
45 plantInfo.setPlantContent(content);
46 }
47 break;
48// 一个节点结束的标签
49 case XmlPullParser.END_TAG:
50// 一个城市的信息处理完毕,city的结束标签
51 if ('plantsInfo'.equals(parser.getName())) {
52// 一个城市的信息 已经处理完毕了.
53 plantInfos.add(plantInfo);
54 plantInfo = null;
55 }
56 break;
57 }
58// 只要不解析到文档末尾,就解析下一个条目。得到下一个节点的事件类型
59// 注意,这个一定不能忘,否则会成为死循环
60 type = parser.next();
61 }
62 return plantInfos;
63 }
64 }
(5)编写与界面交互的逻辑代码
在MainActivity中编写与界面交互的逻辑代码,具体如下所示:
1 public class MainActivity extends Activity implements OnClickListener {
65 private ListplantInfos;
66 private TextView mPlantContentTV;
67 private ImageView mPlantImgv;
68 @Override
69 protected void onCreate(Bundle savedInstanceState) {
70 super.onCreate(savedInstanceState);
71 setContentView(R.layout.activity_main);
72 try {
73//获取植物信息
74 plantInfos = utils.getPlantInfos(MainActivity.class
75 .getClassLoader().getResourceAsStream('plant.xml'));
76
77 } catch (Exception e) {
78 e.printStackTrace();
79 }
80 initView();
81 }
82 /**
83* 初始化控件
84 */
85 private void initView() {
86 findViewById(R.id.btn_xrq).setOnClickListener(this);
87 findViewById(R.id.btn_xrk).setOnClickListener(this);
88 findViewById(R.id.btn_xyc).setOnClickListener(this);
89 mPlantContentTV = (TextView)findViewById(R.id.tv_plants_content);
90 mPlantImgv = (ImageView) findViewById(R.id.imgv_plant);
91 mPlantContentTV.setText('\u3000\u3000'+plantInfos.get(0).getPlantContent());
92 mPlantImgv.setBackgroundResource(R.drawable.a);
93 }
94 @Override
95 public void onClick(View v) {
96 switch (v.getId()) {
97 case R.id.btn_xrq:
98//设置植物简介
99 mPlantContentTV.setText('\u3000\u3000'+plantInfos.get(0).getPlantContent());
100 mPlantImgv.setBackgroundResource(R.drawable.a);
101 break;
102 case R.id.btn_xyc:
103 mPlantContentTV.setText('\u3000\u3000'+plantInfos.get(1).getPlantContent());
104 mPlantImgv.setBackgroundResource(R.drawable.c);
105 break;
106 case R.id.btn_xrk:
107 mPlantContentTV.setText('\u3000\u3000'+plantInfos.get(2).getPlantContent());
108 mPlantImgv.setBackgroundResource(R.drawable.b);
109 break;
110 }
111 }
112 }
(6)运行程序
运行“植物百科”程序,能看到如图4-4左侧所示的界面,点击“向日葵”按钮可以看到图4-4右侧所示的界面。