繼續我們的學習。
相信我,第一天的工作是最為重要的,通過這些工作,我們把開發安卓所必須的環境、基礎條件都配置好了,相信肯定遇到了很多問題,不過,根據我的經驗,您會很快解決這些問題的。在第一天的最后,我們終於運行了第一個應用->“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就可以給自己獨家使用了。很有成就感了是不是,不過,這樣的應用除了自己誰會用呢?恐怕連自己也是看都不想看吧。
如果您有更要的要求,那么,明天我們繼續。
附件是本次的工程文件,點擊下載。





