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。

我們最終的頁面效果如下所示:

device-2015-01-18-130830

 

任務分解

不要被嚇到,不管現在看起來多么復雜,這終究會從我們的手中實現。為了實現這樣的一個應用,我們需要分為一個一個小項目,這樣看起來就不是那么龐然大物,我們心里底氣也足了。

如果您曾經做過項目管理相關工作的話,那么對於WBS(工作分解結構)一定很熟悉了,我們的應用規模不算大,可以分解為如下小項目:

1. 學習調用HTTP接口,將返回的JSON數據封裝為Java類,並且最終將天氣數據展示到頁面上

2. 學習使用百度地圖SDK定位當前位置,並將當前位置信息保存為本地數據

3. 如果沒有網絡,我們就沒辦法查看天氣了嗎?這當然是有問題的,我們要把天氣數據保存到本地數據庫,並且默認顯示本地數據

4. 美化UI

在這短短的10天內,我們要把這些工作都做完,不要犯怵,Follow me!!!

千里之行始於足下

新建一個工程,Application Name填Weather,Package Name填com.demo.weather,SDK各個項目的選擇如下:

QQ截圖20140910225041

 

選擇好之后,就一路點擊【Next】直到我們的項目建好為止,建好的項目應該是這樣子的:

QQ截圖20140910225349

 

打開res/layout/activity_main.xml,在Eclipse中應該是這個樣子的:

QQ截圖20140910225709

 

注意視圖的下方有兩個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了。運行吧。

這下界面上顯示的就是一大堆天氣的數據了。

device-2015-01-18-131401

 

如果顯示的還不正確,那么請仔細檢查一下是否有遺漏的代碼,是否真的可以連上網絡。

如果您可以正確的顯示上面那一大堆字符,並且能正確理解那一大堆字符的意義,並且對於界面什么的也沒有要求的話,那么我們的天氣預報APP就可以給自己獨家使用了。很有成就感了是不是,不過,這樣的應用除了自己誰會用呢?恐怕連自己也是看都不想看吧。

如果您有更要的要求,那么,明天我們繼續。

 

附件是本次的工程文件,點擊下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM