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