毕业
(论文)
题 目 基于Android平台的气象服务系统的设计与实现
英文题目Design and Implementation of the meteorological service system based on the Android platform
学生姓名 马龙
学 号 08114112
指导教师 何月顺 职称 教授
专 业 网络工程
二零一二年五月
摘 要
随着智能手机的快速普及,智能手机用户希望能够随时随地查询互联网所提供的服务,一种高效的办法就是将应用系统的功能拓展到手机终端上,让手机能够通过移动网以及互联网访问Web网站并处理各种各样的业务。因此,本文就在分析讨论Android手机软件开发技术原理的基础上,详细介绍了在Android 嵌入式平台下实现Google 天气预报客户端的开发,主要包括Google天气预报xml文档的获取与解析、天气预报信息在Android 平台下的呈现等方面技术的介绍。
Android平台的气象服务系统基于Eclipse的开发环境,依托Google气象数据获得实时天气信息,利用SAX解析器对获得的Google Weather API进行解析获得数据,将天气情况显示在界面上,同时显示今后四天的天气情况,查询范围概括了目前绝大多数城市,同时有着美观、大方的界面,方便的操作与良好的视觉感。但Android 碎片化的问题导致本程序在一些机型上面运行效果不好,或者不能够运行,程序运行环境需要Android2.3.3版本才能完美运行成功。
关键语:android; Google 天气预报; 碎片化
ABSTRACT
With the rapid proliferation of smart phones, smart phone users want to be able to query the services provided by the Internet anytime, anywhere, and an efficient way to expand the functionality of the application system to the mobile terminal, so that the phone through the mobile network and Internet access to the Web siteand handle a variety of businesses. Therefore, this paper, based on the analysis and discussion of the Android mobile phone software development technical principles, detailed in the Android embedded platform Google Weather client development, including the acquisition and parsing of Google Weather xml document, the weather forecast information in presentation technology introduced in the Android platform.
Meteorological service system of the Android platform, Eclipse-based development environment, relying on Google meteorological data to obtain real-time weather information, using the SAX parser to parse the access to Google Weather API to obtain data, and display the weather conditions at the interface also shows the next four days weather conditions, the scope of the query summarizes the present, most of the city, at the same time have a beautiful, elegant interface, easy operation and good visual sense. Android fragmentation problem caused the program in some models run effect is not good, or not be able to run the environment for running programs Android2.3.3 perfect version to run successfully.
Key words: the android; Google weather forecast; fragmentation
目 录
I摘 要
IIABSTRACT
1绪 论
10.1研究内容
10.2 选题的目的及意义
10.3研究现状、发展趋势和问题
31 系统分析
31.1 研究目标
31.2 需求分析
31.3 性能分析
42 系统开发环境及相关技术
42.1 Android开发环境介绍
42.2 Android开发平台搭建
52.3 Android关键技术研究
62.3.1 Activity
62.3.2 Service
72.3.3 Broadcast Receiver
72.3.4 Content Provider
93 系统详细设计
93.1 用户界面设计
93.2 程序模块设计
103.3 数据流在程序中的传输过程
124 程序开发
124.1 文件结构与用途
144.2 工具类的简单介绍
144.2.1 Current_conditions类及相似类的介绍
144.2.2 TestPinYin4j类的介绍
144.2.3 HttpDownLoader类的介绍
154.2.4 MyHandler类的介绍
154.3 用户界面
154.3.1 布局文件的介绍
174.3.2 欢迎界面welcome
174.3.3 设置页面MainWeaherActivity
204.3.4 显示页面ShowWeatherActivity
245 系统测试
245.1 启动Android虚拟机
245.2启动App Widget应用程序
255.3欢迎界面
265.4默认显示界面
275.5点击更改城市按钮进入设置页面
285.6查询让你以城市天气情况
305.7查询List列
内的天气情况
326
33致 谢
34参考文献
35附录一
绪 论
0.1研究内容
Android平台的气象服务系统是基于Android手机平台,运用Java语言,从Google上获取天气预报信息,开发出针对使用Android平台的手机天气预报系统。熟悉Android平台的开发软件的流程,程序能够通过互联网获取xml文件,解析获取的xml文件得到有用信息,并将信息呈现在手机上。
0.2 选题的目的及意义
基于Android平台的气象服务系统的开发可以进一步扩大气象信息的覆盖面,让广大公众能够在第一时间方便且快捷地获取最新的气象预报(预警)信息,以便提前预防,把气象灾害造成的损失降到最低。同时也可以强化气象公共服务的职能,完善公共服务体系、改善公共服务手段、增加公共服务产品、提高公共服务质量,更好地发挥了气象事业对经济社会发展的现实性作用。
这款手机天气预报系统给人们提供方便快捷的近期天气信息,是人们日常生活中必不可少的生活信息。系统界面简单明了,操作简单,用户体验感觉很好,能够帮助用户迅速知道当前天气情况,节约查询时间。
0.3研究现状、发展趋势和问题
2011年8月15日,谷歌宣布以125亿美元收购摩托罗拉移动,引发了业内专家对于谷歌收购摩托罗拉移动真实意图的猜测,也让业内人士更进一步认识到,“跨终端操作系统正成为移动互联网产业发展制高点”。
相比于Symbian的日落西山,以及苹果的封闭、Windows Phone的前途未卜,Android无疑代表了当前行业发展的主流趋势:开放平台取代了封闭平台。安卓操作系统发展迅猛主要得益于免费、开源和良好产业运作策略,这三点为安卓在智能手机市场赢得更多的发展机遇。系统的免费让更多的厂商加入,推动了份额的上升;代码的开源让更多的开发者进入应用开发;应用的丰富吸引了更多用户选择。从市场份额占有方面来看,Android的表现非常令人欣喜,飙升到47.3%位居第一,达到历史空前水平。近两年,Android系统在国内的发展主要在于针对Android系统的二次开发上,目前以Android系统源码为基础,再深度定制改版而成的操作系统主要有创新工场投资的点心公司开发的点心操作系统、中国移动的Ophone、联想的乐Phone、阿里云手机操作系统及雷军的小米科技开发的MIUI。
谷歌Android平台快速发展也导致了一系列问题的出现,其中最困扰开发者的是Android 碎片化的问题,这也是本程序面临的问题。100个Android手机制造商拿到Android内核之后,可以制造出100种搭载不同硬件平台、界面的Android手机,虽然是基于Android的,但实际上,已经不再是原来的Android了,经过各种改造之后,已经变成100个“独立”的Android ,这就是碎片化。系统和硬件有一定的一致性,这才能确保软件的兼容性,个人和团体开发的第三方软件也有一定的规范,以确保软件和设备完全兼容。从开发者的角度来看,就要为Android各个版本、各种手机型号、各种显示屏大小甚至各种定制化安卓ROM分别设计一款应用程序。或者需要兼容各个不同版本的Android,间接加大了软件开发的难度(主要难度是让软件在更多的设备上运行)。图0-1显示了目前正在使用的 3997 款不同的型号的Android版本。
图0-1 目前不同型号的Android系统
1 系统分析
1.1 研究目标
(1) 了解Android应用程序的设计和开发过程;
(2) 使用多种组件进行Android 平台气象服务系统的开发。
本软件是基于Eclipse的开发环境,依托Google气象数据获得实时天气信息,开发出了针对Android平台的手机天气预报系统。
1.2 需求分析
手机发展到今天已成为广大群众们日常是用的通讯工具,手机具备的功能也日趋完善,其中天气预报是最常见的一项功能,本设计可以在手机上实现天气情况的实时报告和天气预报功能,满足人们生活的需要。
本设计是一个App Widget应用程序,启动程序后显示南昌当前天气情况和未来的天气清况,点击更换城市可以进行城市的设置,程序通过图片和文字显示当前和未来的天气状况,包括温度、湿度、风向和雨雪情况等。每次退出程序会保存用户最后查询的城市,
在SD卡的文件夹下,下次启动会查询上次记录的城市,人性化设计。这些天气数据是通过后台服务的Android HttpURLConnection跟Web服务器通信获取的,从Google上获取Google天气预报xml文档,解析后将天气信息显示在界面上。
从上面的描述中可以基本了解软件的功能需求:
(1) 启动App Widget应用程序;
(2) 欢迎界面。
(3) 默认显示界面:通过文字图片动画显示南昌的天气情况,包括城市当前天气、温度、风向、风速、湿度;同时显示今后四天的天气情况。
(4) 设置界面:设置想要查询的城市,有一些国内主要城市可选择。
(5) 查询结果:点击查询后返回显示界面,显示目标城市的天气情况,无网络或者查询城市不存在时提示用户。
1.3 性能分析
本软件操作简单,应用方便,程序响应速度快、安全性高、信息处理速度快。但需要较好的网络支持,在无网络情况下不能够查询。目前只支持Android2.3.3版本,在Android4.0以上版本中联网失败。
2 系统开发环境及相关技术
2.1 Android开发环境介绍
Android的上层应用程序是用Java语言开发,同时还需要基于Dalvik虚拟机,所以,Google公司推荐使用主流的Java继承开发环境Eclipse。只有Eclipse还不够,因为是使用Java语言进行开发,还应该有由SUN公司提供的Java SDK(其中包括JRE:Java Runtime Environment)。此外,Android的应用程序开发和Java开发有较大区别的,所以还需要有Google提供的Android SDK。同时,还需要在Eclipse安装ADT,为Android开发提供开发工具的升级或者变更,是Eclipse下开发工具的升级下载的工具。
简言之,需要以下软件,才能搭建Android开发环境,从而进行Android应用程序的开发。
(1) Java SDK
(2) Eclipse
(3) Android SDK
(4) ADT
2.2 Android开发平台搭建
Android开发平台搭建步骤:
①首先到http://www.eclipse.org/downloads/下载Eclipse集成开发环境并且解压,这里推荐下载Java EE 集成版本,可以为平台的搭建省下不少工作。接着再去http://java.sun.com/javase/downloads/index.jsp 站点下载SDK后安装,下载http://dl.google.com/android/android-sdk-windows-1.5_r1.zip,Android SDK1.5后解压。第一步下载工序就结束了。
②双击Eclipse解压后目录中的eclipse.exe然后启动,选择Eclipse菜单中的Help-> Install New Software-> 选项卡上的Available Software,点击右侧的“Add”输入http://dl-ssl.google.com/android/eclipse/后确定,然后在“Work with”下拉菜单中选择刚才输入的网址。过一会就会出现一个Developer Tools选项,勾上以后点击Next以后Eclipse会自动网上查找Android 开发工具插件,然后找到Android DDMS和Android Development Tools,选中这两个点击Finish,Eclipse就会自动下载并安装Android插件了,最后会提示重启Eclipse。
③重启后选择Eclipse菜单中的Windows-> Preferences 在左侧的Android项目中SDK Location中填入Android SDK解压后的目录,然后点击Apply。
④在Windows7的系统变量中的path变量中添加一个值,该值指向解压后的Android SDK目录下的tools文件夹。如图2-1所示:
图2-1 环境变量的配置
2.3 Android关键技术研究
Android平台是基于java语言开发的,其中android主要是四大组建构成的,Activity、Service、Broadcast Receiver、Content Provider。图2-2显示了Android系统的框架结构。
图2-2 Android系统的框架结构
2.3.1 Activity
Activity就是一个用户界面,比如打电话程序,实现一个打电话的Activity,通讯录也是一个Activity,通话记录也是一个Activity等等,这些Activity都是独立的,但组合在一起就是一个完整功能的应用程序了。
2.3.2 Service
从字面上意思就是服务的意思,其实就是Activity的后面服务,他们在很多地方都相辅相成的,封装有一个完整的功能逻辑实现,Service就是为Activity在后面服务的,作为Activity的坚实后盾。Service在后台为Activity提供所需要的功能。Android中的服务其实与windows中的服务类似,它执行长时间运行的操作,或运程进程执行工作。服务不提供用户界面。
Android中的服务,和我们通常说的Windows服务,Web的后台服务又有一些相近,它们通常都是后台长时间运行,接受上层指令,完成相关事务的模块。用运行模式来看,Activity是跳,从一个跳到一个,这有点像模态对话框,给一个输入,然后不管不顾的让它运行,离开时返回输出。而Service不是这样的,Service主要是等着上层连接上它,然后产生一段持久的通信。
但和一般的Service还是有所不同,Android的Service和所有四大组件一样,其进程模型都是可以配置的,调用方和发布方都可以有权利来选择是把这个组件运行在同一个进程下,还是不同的进程下。它凸显了Android的运行特点。 Android中用来做数据序列化的类是Parcel,封装了序列化的细节,向外提供了足够对象化的访问接口,Android号称实现非常的高效。
Service从实现角度看,最特别的就是RPC的实现了,其他内容,都会接近于Activity的一些实现。
2.3.3 Broadcast Receiver
从字面意思是广播接收者,其实和我们生活中得广播意思相近,在发生什么事情的时候,会以广播的形式告知我们。广播又分为普通广播和有序广播。普通广播是异步的,理论上是同时收到的。你不能对他做任何操作,不能终止。有序广播,在接收到广播时可以加入自己的操作,传递给下一个接收者,也可以终止广播。Android系统中最常见的广播电池电量低得时候,收到短信的时候,USB连接的时候等等。
内容提供者主要用于应用程序的数据共享设置,你可以把数据存储在文件系统中,或者SQLite数据库上,网络,或者其他的持久性存储位置。你可以访问这些数据或者修改,其他应用程序也可以访问或者修改。
在Android中,充分考虑了广泛的这类需求,于是就有了Broadcast Receiver这样的一个组件。每个Broadcast Receiver都可以接收一种或若干种Intent作为触发事件,当发生这样事件的时候,系统会负责唤醒或传递消息到该Broadcast Receiver,任其处置。在此之前和这以后,Broadcast Receiver是否在运行都变得不重要了。
当Broadcast Receiver接收到相关的消息,它们通常做一些简单的处理,然后转化称为一条Notification,一次振铃,一次震动,抑或是启动一个 Activity进行进一步的交互和处理。所以,虽然Broadcast整个逻辑不复杂,却是足够有用和好用,它统一了Android的事件广播模型,让很多平台都相形见绌了。
2.3.4 Content Provider
应用程序可以通过Content Provider 来访问其他应用程序的一些私有数据,这是Android提供的一种标准的共享机制。共享的数据可以存在于很多方面,比如在系统中、数据库中或者在其他的一些程序里。Content Provider可以扩展自己的Content Provider类,通过实现自己的类的接口来控制其他数据的存储。然后程序不会直接调用ContentProvider中的
,而是通过任何一个能与Contentprovider通讯。
任何时候当Android系统收到一个需要某个组件进行处理的请求的时候,Android会确保处理此请求的组件的宿主进程是否已经在运行,如果没有,则立即启动这个进程,当请求的组件的宿主进程已经在运行,它会继续查看请求的组件是否可以使用,如果不能立即使用,它会创建一个请求的组件的实例来响应请求。
Content Provider,内容提供者主要用于应用程序的数据共享设置,你可以把数据存储在文件系统中,或者SQLite数据库上,网络,或者其他的持久性存储位置。你可以访问这些数据或者修改,其他应用程序也可以访问或者修改。
在各大组件中,Service和Content Provider都是那种需要持续访问的。Service如果是一个耗时的场景,往往会提供异步访问的接口,而Content Provider不论效率如何,都提供的是约定的同步访问接口。因为Content Provider仅是提供数据访问的,它不能确信具体的使用场景如何,会怎样使用它的数据;而相比之下,Service包含的逻辑更复杂更完整,可以抉择大部分时候使用某接口的场景,从而确定最贴切的接口是同步还是异步,简化了上层调用的逻辑。
3 系统详细设计
3.1 用户界面设计
根据需求分析可以知道,应用程序应包含两个主要的用户界面,这里需要进一步分析每个用户界面中应该包括哪些显示内容。
在“设置页面”中,需要对要显示天气预报的城市进行设置。在“显示页面”中,显示当前的天气状况,包括城市名称、温度、湿度、风向、雨雪情况和获取数据时间等信息,还要显示未来四天的天气情况。
根据对用户界面显示内容的分析,绘制出用户界面的草图,如图3-1所示。
图3-1 用户界面草图
3.2 程序模块设计
从功能需求上分析可以看出,整个应用程序应划分为4个模块,分别是程序启动、默认显示界面、设置界面和后台服务,各模块之间的关系如图3-2所示。
图3-2 程序模块结构图
从模块结构图中不难看出,整个应用程序的核心在于界面和后台,两个界面分别按照图4-1来设计完成,但android碎片化的干扰下不可能符合每个手机型号,本设计采用480x800的格式,在用于其它手机型号是可适当修改。
3.3 数据流在程序中的传输过程
应用程序启动后,首先显示界面的Activity被激活,经过判断后认为是第一次启动程序,然后通过后台服务的Android HttpURLConnection跟Web服务器通信获取Google的天气数据,这时候设定查询的城市默认为南昌,得到的xml 文档暂时写入到一个字符串中存储在手机内存中,然后构建SAXParser对得到的xml文档进行解析,得到相应的数据并存储到工具类中,通过界面Activity的调用显示在相应的控件中,模块结构如图3-3所示。
图3-3 显示界面运行结构图
显示界面中有更改城市按钮,点击后进入设置界面可以输入想要查询的城市,支持中文输入,同时有一些国内主要城市供选择,方便用户更加快捷的查询。点击查询按钮后通过后台服务的Android HttpURLConnection跟Web服务器通信判断输入的城市是否存在,若存在则激活显示界面,若不存在返回设置界面重新输入。模块结构如图3-4所示
图3-4 设置界面运行结构图
在完成用户界面设计和模块设计后,至此程序设计阶段基本完成。
4 程序开发
4.1 文件结构与用途
在程序开发阶段,首先确定“Android平台气象服务系统”的工程名为EcitWeather,据程序模块设计的内容,建立EcitWeather工程。EcitWeather工程源代码的结构如图4-1所示。
图4-1 EcitWeather工程的源代码文件
为了使源代码文件的结构更加清晰,EcitWeather工程设置了多个命名空间,分别用来保存用户界面、后台服务以及工具实体的源代码文件,源代码文件的名称以及说明如表4-1所示。
表4-1 EcitWeather工程的文件用途说明
包 名 称
文 件 名
说 明
com.ecit.until
Current_conditions.java
com.ecit.until
HttpDownLoader.java
Google天气预报xml文档和天气图片的获取
com.ecit.until
My_City.java
存放查询的城市、当前时间、发布时间等数据
com.ecit.until
MyDate.java
String转Date工具类
com.ecit.until
MyHandler.java
使用SAX解析Google天气预报xml文档
com.ecit.until
TestPinYin4j.java
汉字转全拼工具类
com.ecit.until
Weather.java
存放未来天气数据
com.ecit.until
Welcome.java
欢迎界面的Activity
com.ecit.weather
MainWeaherActivity.java
设置界面的Activity
com.ecit.weather
ShowWeatherActivity.java
显示界面的Activity
Android的资源文件保存在/res的子目录中。其中/res/drawable/目录中保存的是默认图标文件,/res/raw目录中保存的是背景和图标文件,/res/values目录中保存的是用来自定义字符串的文件,/res/layouyt目录中保存的是xml格式的布局文件。所有在程序开发阶段可以被调用的资源都保存在这些目录中,具体每个资源文件的用途可以参考表4-2:
表4-2 资源文件名称与用途
资源目录
文 件
说 明
drawable-hdpi
ic_launcher.png
这三个文件夹里是默认的APP图标。
drawable-ldpi
ic_launcher.png
drawable-mdpi
ic_launcher.png
layout
main.xml
“设置界面”的布局
result.xml
“显示界面”的布局
shape.xml
自定义按钮的设定
user.xml
List列表中Textview的设定
Raw
android.png
提示小图标
b.png
报字图
haungyuan.png
显示界面背景图
q.png
气字图
rain.png
雨天提示图标
snow.png
雪天提示图标
sun.png
晴天提示图标
t.png
天字图
tianqi.png
设置界面小图标
weather.png
APP图标
y.png
预字图
yu.png
欢迎界面背景图
wu.png
雾天图标
values
string.xml
自定义子字符串属性文件
4.2 工具类的简单介绍
com.ecit.until包里面存放着工程所用到的工具类,用于获取和解析Google天气预报xml 文档、信息数据的存储,从Google提供的Web Service中获取的天气数据的方法有三种1.邮政编码法,2.经纬度坐标作法,3.城市名称法。这里选用比较常用的第三种方法,好处是得到的信息简单明了,坏处是有些城市不在查询范围,数据的获取地址是:“http://www.google.com/ig/api?hl=zh-cn&weather=城市名”, 其中城市名只识别拼音和英文,因此还要用到拼音转换类。
4.2.1 Current_conditions类及相似类的介绍
Current_conditions类用于存放当前天气情况的信息,主要包括天气情况currentCondition,华氏温度currentFTemperature,摄氏温度currentCTemperature,湿度currentHumidity ,风况currentWind ,天气图标currentIcon。
My_City类用于存放当前查询城市的时间的信息,主要包括查询城市city,和当前时间date以及发布日期currentTime。
MyDate类主要用于得到后三天的日期,由于解析XML文档只能获得当前日期,要想获得后三天天气日期需要对得到的当天天气日期进行增减。
Weather类主要用于存放前后四天主要的天气情况将以表格的形式显示在界面上,方便用户查看主要包括星期week,低温low,高温high,天气图标icon,天气情况condition。
4.2.2 TestPinYin4j类的介绍
由于从Google只能识别拼音和英文不能识别汉语,所以要用到拼音转换类,在项目中加载pinyin4j-2.5.0.jar包, TestPinYin4j类要用到jar包中的方法,通过TestPinYin4j类判断字符串是汉字,如果是,转换为拼音,如果不是则保留。
4.2.3 HttpDownLoader类的介绍
HttpDownLoader类包括了获取Google天气预报XML文档、天气图片的获取和图片大小的三个方法,通过HttpURLConnection跟Web服务器通信获取所需的文件。
4.2.4 MyHandler类的介绍
MyHandler继承DefaultHandler类,DefaultHandler类实现ContentHandler接口,该接口封装了一些对事件处理的方法用来解析XML,获取数据,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。解析完成后将得到的数据存储到Current_conditions类、My_City类、MyDate类和Weather类中。
至此,工具类介绍完毕,最后还需要在AndroidManifest.xml文件中添加上网许可和储存卡写入读取许可。
4.3 用户界面
在用户界面设计上,采用了AppWidget框架结构,提供直观的交互操作。三个用户界面风格简约、操作简便,用户体验将非常好。
4.3.1 布局文件的介绍
main.xml是设置界面的布局,采用LinearLayout 的布局,自定义背景图片,大小采用480x800格式,MainWeaherActivity类中用到了这个布局。主要是显示设置界面的布局情况核心代码如下:
result.xml是显示界面的布局,ShowWeatherActivity中用到了这个布局,设置和作用和main.xml类似,就不再重复介绍了,具体可参照result.xml类的介绍。
welcome.xml是欢迎界面的布局,比较简单,是进入程序的过度界面,就不多介绍了。
由于Android自带的按钮不够美观,这里自制了一个按钮外形,布局文件是shape.xml分别在两个布局中使用,实际效果如图4-2。
图4-2 自定义按钮
4.3.2 欢迎界面welcome
Welcome是程序进入前的欢迎界面,主要作用是在进入程序的等待时间让用户看到一个欢迎界面,3秒后自动跳转到主程序。
4.3.3 设置页面MainWeaherActivity
MainWeaherActivity继承使用了ListActivity。ListActivity可以不通过setContentView( )设置布局,也不必重载onCreate( )方法,而直接将显示列表加载到ListActivity,增加了使用的便利性。在此工程中,仍然使用setContentView( )设置布局,这样做的好处是可以在界面中设置更为复杂的显示元素。实现了View.OnClickListener接口,会点击查询按钮就会跳转到查询城市的显示界面。添加了进度条,是用户可以看到查询情况,避免尴尬的等待,在查询失败情况下跳转回设置界面会提示用户查询失败原因。最后添加了菜单栏,可以查看版本信息和返回。核心代码如下:
(1)继承ListActivity并定义对象
public class MainWeaherActivity extends ListActivity {
private EditText editText1 = null;
private Button button1 = null;
ProgressDialog mypDialog = null;
Intent intent = new Intent();
private ArrayList
> list = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
(2)设置布局文件detail.xml
setContentView(R.layout.main);
(3)实现List列表呈现国内主要城市(可扩展)
list = new ArrayList>();
HashMap mp1 = new HashMap();
......
mp1.put("city_name", "北京");
mp1.put("city_country", "北京");
......
list.add(mp1);
......
SimpleAdapter listAdpater = new SimpleAdapter(this, list, R.layout.user,
new String[]{"city_name","city_country"},
new int[]{R.id.city_name,R.id.city_country});
setListAdapter(listAdpater);
(4)得到相应的组件
editText1 = (EditText) findViewById(R.id.editText1);
button1 = (Button) findViewById(R.id.button1);
(5)自定义进度条的实现
mypDialog = new ProgressDialog(this);
mypDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mypDialog.setTitle("Weather");
mypDialog.setMessage(getResources().getString(R.string.wtext));
mypDialog.setIcon(R.raw.android);
mypDialog.setIndeterminate(false);
mypDialog.setCancelable(true);
(6)无法查询后返回对话框
Intent myIntent = getIntent();
String error = myIntent.getStringExtra("error");
if(error != null){
dialog();
}
button1.setOnClickListener(new ChooseOnclickListener());
}
(7)List点击事件
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Toast.makeText(MainWeaherActivity.this, "你选中的是"+list.get(position).get("city_name"), Toast.LENGTH_SHORT).show();
if(position == 0){
intent.putExtra("chooseCn", "北京");
}
......
intent.setClass(MainWeaherActivity.this, ShowWeatherActivity.class);
MainWeaherActivity.this.startActivity(intent);
}
(8)添加菜单栏
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add(0, 1, 1, R.string.exit);
menu.add(0, 2, 2, R.string.about);
return super.onCreateOptionsMenu(menu);
}
菜单栏的实现
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId() == 1 ){
finish();
}
if (item.getItemId() == 2) {
Toast.makeText(MainWeaherActivity.this, "天气预报系统能够查询国内主要城市近四天的天气情况", Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
(9)查询事件
class ChooseOnclickListener implements OnClickListener{
public void onClick(View v) {
// TODO Auto-generated method stub
mypDialog.show();
String chooseCn = editText1.getText().toString();
intent.putExtra("chooseCn", chooseCn);
intent.setClass(MainWeaherActivity.this, ShowWeatherActivity.class);
MainWeaherActivity.this.startActivity(intent);
}
}
(10)自定义带按钮的对话框
protected void dialog() {
AlertDialog.Builder builder = new Builder(MainWeaherActivity.this);
builder.setMessage("所查询的城市不存在或当前网络不可用");
builder.setTitle("提示");
builder.setPositiveButton("确认", new MyOnClickListener());
builder.create().show();
}
class MyOnClickListener implements android.content.DialogInterface.OnClickListener{
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
}
}
4.3.4 显示页面ShowWeatherActivity
DetailForecastActivity主要用来显示详细的天气信息,包括当天和未来四天的天气信息。第一次启动程序时会默认显示南昌天气情况,点击更改城市按钮后跳转到设置界面,按照MainWeaherActivity类中传递到信息进行查询天气信息,然后显示到界面上,在晴天、雨天、雪天和雾天会提示用户关注天气情况,注意出行安全。核心代码如下:
(1)继承Activity继承ListActivity并定义对象
public class ShowWeatherActivity extends Activity {
private Button button2 = null;
private TextView[] arraytextview = new TextView[24];
private ImageView[] arrayimageview = new ImageView[5];
private List list = null;
private Current_conditions currentconditions = null;
private My_City city = null;
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-gener