——量變産生質變,如果你從第一篇一直看到了這篇,可以說這就是你的質變點之一。
經過數篇對Android應用程式的原理的講述,現在我們大概回顧一下。
至此,我們終于算是完全算是雙腳步入Android開發的大門了,但我們現在還隻能算是金字塔底端的那群人,還需要不斷地實踐、實踐、再實踐。而且上面所講的是作為一個真正Android開發人員必須要深刻了解的東西,如果您還沒有達到深刻的程度那請你回去再浏覽一遍,然後跟着我的這個系列繼續深入學習,在接下來的文章我将更多的是利用執行個體來解析這些東西。下面我再次用Hello World程式來分析一下Android應用程式,主要内容如下:
“Hello World!”顯示淺析
“Hello World!”的手術(一)
“Hello World!”的手術(二)
“Hello World!”的手術(三)
首先我們再次簡單地建立一個Hello World項目,它的布局檔案res\layout\main.xml的代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
在main.xml檔案中以這種格式:
@[package:]string/some_name (where some_name is the name of a specific string)
引用res/values/strings.xml檔案中的字元串,其中some_name是要引用的字元串的名字。strings.xml檔案代碼如下:
<resources>
<string name="hello">Hello World, HelloWorld!</string>
<string name="app_name">HelloWorld</string>
</resources>
由此可見,上面那個<TextView>的android:text引用的字元串是“Hello World, HelloWorld!”。接着想象一下,“Hello World, HelloWorld!”何時加載顯示的呢?
Note:這種<TextView>的text的值是存儲在strings.xml中的,而不是寫死的。這樣的好處是,當我們在strings.xml中修改hello的具體值時,不需要在main.xml中修改。
我們來看下src目錄下skynet.com.cnblogs.www包(就是建立Hello World項目時定義的包名)中的HelloWorld.java檔案,代碼如下:
package skynet.com.cnblogs.www;
import android.app.Activity;
import android.os.Bundle;
public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
可以看出在建立活動時,即void onCreate(Bundle saveInstanceState)中,在HelloWorld中重寫了它,在該方法中首先調用了父類的onCreate方法且接着調用了setContentView(R.layout.main)方法。是的,就是在這個方法中,根據main.xml檔案将其顯示出來,因為R.layout.main是表示布局資源檔案main.xml編譯後的對象,Eclipse插件會自動在R.java檔案中建立這個引用。main.xml中定義了<TextView>,然後根據它的android:text屬性引用到strings.xml檔案中的<stringname="hello">Hello World, HelloWorld!</string>元素,然後将它顯示到螢幕上。
至此,我們對Hello World的認識更加深入了一點!下面我們讓拿起手術刀對它進行一個手術。
我們将main.xml檔案中的<TextView>元素删掉,取而代之用一個Button來顯示“Hello World!”。代碼如下:
<Button
android:layout_width="fill_parent"
</LinearLayout>
其它的地方不用修改,直接運作即可!
<a target="_blank" href="http://blog.51cto.com/attachment/201008/093559459.jpg"></a>
圖1、修改之前的
<a target="_blank" href="http://blog.51cto.com/attachment/201008/093644768.jpg"></a>
圖2、修改之後的
從這個例子我們可以看出我們上節的分析是對的,接下來我們繼續對它做一個手術。
我們這次不用Button來顯示“Hello World!”,我們這次用一個圖檔來顯示。首先我們準備一張png的圖檔,如下:
<a target="_blank" href="http://blog.51cto.com/attachment/201008/093733681.jpg"></a>
圖3、hello.png
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
public final class R {
public static final class attr {
public static final class drawable {
public static final int hello=0x7f020000;//這行是Android自動新加的
public static final int icon=0x7f020001;
public static final class layout {
public static final int main=0x7f030000;
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
drawable- hdpi、drawable- mdpi、drawable-ldpi的差別: (1)drawable-hdpi裡面存放高分辨率的圖檔,如WVGA (480x800),FWVGA (480x854) (2)drawable-mdpi裡面存放中等分辨率的圖檔,如HVGA (320x480) (3)drawable-ldpi裡面存放低分辨率的圖檔,如QVGA (240x320) 系統會根據機器的分辨率來分别到這幾個檔案夾裡面去找對應的圖檔。
删除剛才我們添加的<Button>元素,添加一個<ImageView>元素。
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:src="@drawable/hello"
/>
運作之後,結果如下所示:
<a target="_blank" href="http://blog.51cto.com/attachment/201008/093938617.jpg"></a>
圖4、圖檔顯示Hello World
我們看到上面的ImageView有一個id屬性。其實,每個View對象都有一個關聯的ID,來唯一辨別它。當應用程式被編譯時,這個ID作為一個整數引用。但是ID通常是在布局XML檔案中作為字元串配置設定的,在元素的id屬性。這個XML屬性對所有的View對象可用且會經常用到。XML中的ID文法如下:android:id="@+id/my_button"。
字元串前的@符号表示XML解析器應該解析和擴充剩下的ID字元串,并把它作為ID資源。+符号表示這是一個新的資源名字,它必須被建立且加入到我們的資源(R.java檔案,R是Resource)。Android架構提供一些其他的ID資源。當引用一個Android資源ID時,你不需要+符号,但是你必須添加android包名字空間,如下:android:id="@android:id/empty"。
上面兩個手術都是基于main.xml的,在布局資源檔案中聲明相應的控件并設定相關屬性,如TextView、Button、ImageView等,然後在onCreate()方法中調用setContentView(R.layout.main)方法來輸出。其實上面的幾個實驗我們都可以程式設計地進行,下面就以程式設計地用ImageView顯示“Hello World!”,别的也是類似來完成。
首先,我們将main.xml檔案中的<ImageView>删掉,且将res/values/strings.xml中的<string name="hello">Hello World, HelloWorld!</string>删掉(其實第3節,用圖檔顯示就沒有用到它);然後,在HelloWorld.java檔案中 import android.widget.ImageView;且删掉onCreate()方法中調用setContentView(R.layout.main)方法,因為我們不需要根據main.xml布局資源檔案來顯示而是程式設計地Hello World。
接下來我們在onCreate()方法中聲明一個ImageView對象,并設定它的圖像資源,最後将這個ImageView對象傳給setContentView()方法,代碼如下:
import android.widget.ImageView;
ImageView imageHello=new ImageView(this);
imageHello.setImageResource(R.drawable.hello);
setContentView(imageHello);
}
運作之後,同樣會得到Hello World的手術(二)的結果,隻是圖檔的顯示位置不太一樣。在這裡注意上面那行粗體代碼,如果是TextView或者Button的話,應該調用setText()方法來設定”Hello World!”。
<a target="_blank" href="http://blog.51cto.com/attachment/201008/094125625.jpg"></a>
圖5、程式設計地顯示Hello World!
Note:建構ImageView對象時傳遞了一個this參數,表示與目前上下文(context)關聯。這個Context由系統處理,它提供諸如資源解析、擷取通路資料庫和偏好等服務。因為Activity類繼承自Context,且因為你的HelloWorld類是Activity的子類,它也是一個Context。是以,你可以傳遞this作為你的Context給ImageView引用。
本系列的其它文章:
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365407">Android 開發之旅:環境搭建及HelloWorld</a>
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365402">Android 開發之旅:HelloWorld項目的目錄結構</a>
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365394">Android 開發之旅:android架構</a>
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365392">Android 開發之旅:應用程式基礎及元件</a>
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365389">Android 開發之旅:應用程式基礎及元件(續)</a>
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365383">Android 開發之旅:活動與任務</a>
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365379">Android 開發之旅:程序與線程</a>
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365375">Android 開發之旅:元件生命周期(一)</a>
<a target="_blank" href="http://skynet.blog.51cto.com/1943397/365371">Android 開發之旅:元件生命周期(二)</a>
本文轉自Saylor87 51CTO部落格,原文連結:http://blog.51cto.com/skynet/365358,如需轉載請自行聯系原作者