原文:10天学安卓-第二天
继续我们的学习。
相信我,第一天的工作是最为重要的,通过这些工作,我们把开发安卓所必须的环境、基础条件都配置好了,相信肯定遇到了很多问题,不过,根据我的经验,您会很快解决这些问题的。在第一天的最后,我们终于运行了第一个应用->“Hello, world”。
理论知识
下面我们学习一些理论知识,了解一下安卓系统的架构、组件,有了一些基础知识,才不会感觉迷惑。
先看下整个项目的目录,每个目录都有特定的作用,分别如下:
- src目录,存放源代码文件。
- gen目录,由ADT插件自动生成的R.java文件。
- assets目录,存放资源文件目录。此目录的文件不会在R.java中生成资源ID,不会被编译为二进制,必须使用/assets开始的相对路径按照文件的方式进行访问,可以使用AssetManager 结合其他类进行访问。
- res目录,存放资源文件目录,这里面的每个文件或值都会在R.java中生成一个ID(变量);res/drawable-xxxx是存放图片的目录;res/layout是放置布局文件(xml文件)的目录,每个Activity对应一个XML文件;res/values是放置存储值的文件(xml)的目录;res/values/strings.xml 存放键值对,一般用在程序的多语言版本切换(多个文件,键一样,值不同);res/values/dimens.xml 尺寸;res/values/styles.xml 样式
- AndroidManifest.xml是整个应用程序的配置文件,储存一些 包名,版本号,程序图标,程序标签等。
- project.properties,由ADT插件自动生成,不能修改(修改将被删除)。
对于项目结构有了初步的了解之后,我们就可以有目的的开始我们的工作了。接下来的10天,我们将一步一步实现一个完整的天气预报应用,请注意:是完整的,而不只是Demo。
我们最终的页面效果如下所示:
任务分解
不要被吓到,不管现在看起来多么复杂,这终究会从我们的手中实现。为了实现这样的一个应用,我们需要分为一个一个小项目,这样看起来就不是那么庞然大物,我们心里底气也足了。
如果您曾经做过项目管理相关工作的话,那么对于WBS(工作分解结构)一定很熟悉了,我们的应用规模不算大,可以分解为如下小项目:
1. 学习调用HTTP接口,将返回的JSON数据封装为Java类,并且最终将天气数据展示到页面上
2. 学习使用百度地图SDK定位当前位置,并将当前位置信息保存为本地数据
3. 如果没有网络,我们就没办法查看天气了吗?这当然是有问题的,我们要把天气数据保存到本地数据库,并且默认显示本地数据
4. 美化UI
在这短短的10天内,我们要把这些工作都做完,不要犯怵,Follow me!!!
千里之行始于足下
新建一个工程,Application Name填Weather,Package Name填com.demo.weather,SDK各个项目的选择如下:
选择好之后,就一路点击【Next】直到我们的项目建好为止,建好的项目应该是这样子的:
打开res/layout/activity_main.xml,在Eclipse中应该是这个样子的:
注意视图的下方有两个Tab选项卡,【Graphical Layout】是图形视图,【activity_main.xml】是代码视图,我们切换为代码视图,在TextView处添加一行代码,
android:id="@+id/weather"
这样,我们就可以在代码中使用findViewById方法找到这个TextView控件,不过,为了代码的美观,我们将使用另外的办法。
使用第三方组件
大家都知道,Android是开源的,所以就有很多具有奉献精神的牛人把自己的经验、收获分享给大家,这就是很多很多的开源代码、组件、框架。
在这里我们引入第一个开源组件——xUtils,可以在https://github.com/wyouflf/xUtils这里查看它的详细说明。
首先,下载jar包,并且导入到我们的工程里面,说起来麻烦,做起来那是相当简单。下载地址:https://github.com/wyouflf/xUtils/blob/master/xUtils-2.6.11.jar,然后将下载下来的文件放到工程项目的libs文件夹就可以了。
如何在项目中使用呢?
如果大家懒得看xUtils的文档,那就跟着我一步一步做就好了。
打开src目录下,com.demo.weather的MainActivity文件,添加一个变量,可以命名为txtWeather。
@ViewInject( R.id.weather ) private TextView txtWeather;
这样,我们就可以在代码中使用TextView这个控件了。
接下来,我们看一下onCreate方法,这个方法现在只有两行代码,
super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main );
其中第一行,调用父类的onCreate方法进行界面的绘制,第二行就是加载界面,这两行代码在所以的Activity的子类都是需要调用的,除非你不在界面显示任何内容。
onCreate方法有一个参数savedInstanceState,关于这个我们稍后细说,先说第二行代码
setContentView( R.layout.activity_main );
R.layout.activity_main指向了res/layout/activity_main.xml这个文件,这样界面就知道应该加载这个界面文件了。可能大家都Activity是什么还有些疑惑,不要紧,这些理论知识我们明天再说,今天我们的任务就是把天气数据显示到界面上。当然,我们自己是不知道天气预报数据的,不过万能的互联网什么都有,百度就提供了这方面的数据。
官方文档:http://developer.baidu.com/map/index.php?title=car/api/weather,
一个例子:http://api.map.baidu.com/telematics/v3/weather?location=%E5%8C%97%E4%BA%AC&output=json&ak=YknGmxIoPugT7YrNrG955YLS
好了,万事俱备,只欠代码。如何把天气显示到界面上,总共分三步:
1. 在界面上放置一个TextView用于显示文字,这个我们已经完成了。
2. 调用百度地图的API,获取天气数据,这个我们接下来就要做。
3. 把数据显示到界面上。
松了一口气,喝杯茶,休息十分钟吧,接下来会有大段的代码等着你来完成。
休息好了吧,我们马上开工。
在onCreate方法的setContentView下面添加以下代码,
ViewUtils.inject( this ); HttpUtils http = new HttpUtils(); RequestParams params = new RequestParams(); params.addQueryStringParameter( "location", "北京" ); params.addQueryStringParameter( "output", "json" ); params.addQueryStringParameter( "ak", "YknGmxIoPugT7YrNrG955YLS" ); http.send( HttpMethod.GET, "http://api.map.baidu.com/telematics/v3/weather", params, new RequestCallBack<String>() { @Override public void onSuccess( ResponseInfo<String> responseInfo ) { String weather = responseInfo.result; txtWeather.setText( weather ); } @Override public void onFailure( HttpException arg0, String arg1 ) { String weather = arg1; txtWeather.setText( weather ); } } );
并且删除onCreateOptionsMenu方法。
保存吧,一大段的代码,一大片的红叉,呵呵,不着急,慢慢来,那是因为我们使用了第三方组件的原因,一项一项把缺失的引用添加进来就可以了。如果你嫌麻烦,那么复制这几行代码吧。
import com.lidroid.xutils.HttpUtils; import com.lidroid.xutils.ViewUtils; import com.lidroid.xutils.exception.HttpException; import com.lidroid.xutils.http.RequestParams; import com.lidroid.xutils.http.ResponseInfo; import com.lidroid.xutils.http.callback.RequestCallBack; import com.lidroid.xutils.http.client.HttpRequest.HttpMethod; import com.lidroid.xutils.view.annotation.ViewInject;
这下大家满足了吧,一切看起来都是那么的顺利和完美,来,运行程序。
你看到的可能是这样的内容:
java.io.IOException: Permission denied (missing INTERNET permission?)
为什么?为什么?为什么?
辛辛苦苦,XX都X了,你就让我看这个。
不着急,不着急,上面写得很明白,没有访问网络的权限,那么,在项目里面找到AndroidManifest.xml这个文件,添加一行代码即可。
<uses-permission android:name="android.permission.INTERNET" />
把这行代码加到 <application 的前面就可以了,好了,一切都OK了。运行吧。
这下界面上显示的就是一大堆天气的数据了。
如果显示的还不正确,那么请仔细检查一下是否有遗漏的代码,是否真的可以连上网络。
如果您可以正确的显示上面那一大堆字符,并且能正确理解那一大堆字符的意义,并且对于界面什么的也没有要求的话,那么我们的天气预报APP就可以给自己独家使用了。很有成就感了是不是,不过,这样的应用除了自己谁会用呢?恐怕连自己也是看都不想看吧。
如果您有更要的要求,那么,明天我们继续。
附件是本次的工程文件,点击下载。