鍍金池/ 教程/ Android/ Android SDK 上手指南:Java 應(yīng)用程序編程
Android SDK 上手指南:Java 應(yīng)用程序編程
Android SDK 上手指南:下一步學(xué)習(xí)方向
Android SDK 上手指南:用戶交互
Android SDK 上手指南:項(xiàng)目清單
Android SDK 上手指南:虛擬與物理設(shè)備
Android SDK 上手指南:Activity 與生命周期
Android SDK 上手指南:示例項(xiàng)目
剖析 Android SDK:Android 組件詳解
Android SDK 上手指南:應(yīng)用程序數(shù)據(jù)
Android SDK 上手指南:應(yīng)用程序資源
Android SDK 上手指南:應(yīng)用程序發(fā)布
Android SDK 上手指南:應(yīng)用程序結(jié)構(gòu)
Android SDK 上手指南:知識(shí)測(cè)試(1)
Android SDK 上手指南:用戶界面設(shè)計(jì)
Android SDK 上手指南:運(yùn)行與調(diào)試

Android SDK 上手指南:Java 應(yīng)用程序編程

在這份教程中,我們不會(huì)過(guò)度深入細(xì)節(jié),不過(guò)如果大家對(duì)于某些概念還不大清楚,請(qǐng)點(diǎn)擊此處參閱甲骨文 Java 指南。這是一份非常優(yōu)秀的 Java 語(yǔ)言指導(dǎo)材料,非常適合初學(xué)者。

介紹

如果大家已經(jīng)對(duì) Java 非常熟悉,那么不妨直接忽略這部分內(nèi)容。如果大家的技巧還存在局限或者對(duì) Java 這種語(yǔ)言只聞其名,那么本文將為各位解答很多在 Android 開(kāi)發(fā)當(dāng)中經(jīng)常遇到的問(wèn)題。需要注意的是,這篇文章并不能作為 Java 起步教程來(lái)閱讀,最多只能算是基礎(chǔ)知識(shí)匯總。如果對(duì) Java 毫無(wú)了解,大家還需要參考其它一些額外的 Java 學(xué)習(xí)資料。

在這份教程中,我們不會(huì)過(guò)度深入細(xì)節(jié),不過(guò)如果大家對(duì)于某些概念還不大清楚,請(qǐng)點(diǎn)擊此處參閱甲骨文 Java 指南。這是一份非常優(yōu)秀的 Java 語(yǔ)言指導(dǎo)材料,非常適合初學(xué)者。如果在剛剛開(kāi)始閱讀時(shí)發(fā)現(xiàn)本教程提到的一些內(nèi)容有些陌生,也請(qǐng)大家千萬(wàn)不要驚慌。只要真正著手開(kāi)始在 Android 項(xiàng)目中進(jìn)行嘗試,各位很快就能理解本文表達(dá)的內(nèi)容。

1. Java 語(yǔ)法

第一步

大家已經(jīng)在我們的 Android 項(xiàng)目中見(jiàn)識(shí)過(guò)一部分 Java 語(yǔ)法了,但為了清楚起見(jiàn),讓我們?cè)購(gòu)牧硪粋€(gè)項(xiàng)目重新學(xué)習(xí)。這一次我們不再使用 Android 項(xiàng)目,而直接換成 Java 項(xiàng)目——這樣大家就能更輕松地感受到我們所使用的結(jié)構(gòu)。打開(kāi) Eclipse,點(diǎn)擊“New”按鈕。在彈出的導(dǎo)航窗口中下滾到 Java 文件夾中并將其打開(kāi),選擇“Java Project”然后單擊下一步。

http://wiki.jikexueyuan.com/project/android-sdk/images/5.png" alt="" />

輸入“MyJavaProject”作為項(xiàng)目名稱并點(diǎn)擊“Finish”。Eclipse 接下來(lái)會(huì)在工作區(qū)內(nèi)創(chuàng)建我們的新項(xiàng)目。在 Package Explorer 當(dāng)中,打開(kāi)新項(xiàng)目文件夾,右鍵點(diǎn)擊“src”并選擇“New”、然后選“Class”。這時(shí)在 Name 框中輸入“MyMainClass”。接著勾選旁邊的復(fù)選項(xiàng)“public static void main”最后點(diǎn)擊“Finish”。

http://wiki.jikexueyuan.com/project/android-sdk/images/6.png" alt="" />

Eclipse 會(huì)創(chuàng)建出類并在編輯器中打開(kāi)。大家不必過(guò)多關(guān)注項(xiàng)目結(jié)構(gòu)或者類中的現(xiàn)有內(nèi)容,因?yàn)槲覀兊?Android 項(xiàng)目所使用的結(jié)構(gòu)與 Java 項(xiàng)目并不相同。各位可以利用這個(gè)項(xiàng)目來(lái)磨練自己的 Java 編碼技能,在這里代碼的運(yùn)行與測(cè)試都要比 Android 應(yīng)用簡(jiǎn)便得多,而且我們也能更多地關(guān)注 Java 語(yǔ)法本身。

我們?cè)陬愇募锌吹降摹皃ublic static void main”行就是主方法。無(wú)論方法的具體內(nèi)容是什么,它都會(huì)在應(yīng)用程序運(yùn)行時(shí)加以執(zhí)行。方法的內(nèi)容就是顯示在“public static void main(String[] args)”后面大括號(hào)里的部分。Eclipse 可能還生成了一個(gè)“to do”行——直接無(wú)視就好。在其后創(chuàng)建新行,我們就從這里開(kāi)始添加自己的代碼。

第二步

在 Java 當(dāng)中,一條變量可以保存一個(gè)數(shù)據(jù)值,例如文本字符串或者數(shù)字。當(dāng)我們?cè)?Java 中創(chuàng)建或者“聲明”一個(gè)變量時(shí),需要指定其中的數(shù)據(jù)類型并為其命名。輸入以下代碼:

int myNum; 

這一行聲明了一個(gè)整數(shù)變量。我們可以通過(guò)以下代碼行聲明一個(gè)變量并為其分配一個(gè)值:

int myNum = 5; 

現(xiàn)在我們可以通過(guò)名稱引用這條變量了。添加以下代碼行,從而將變量值寫入到輸出控制臺(tái):

System.out.println(myNum); 

大家一般不會(huì)在自己的 Android 應(yīng)用中以這種方式向系統(tǒng)輸出寫入結(jié)果,而是用 LogCat 視圖取而代之。不過(guò)通過(guò)這種輸出寫入方式,我們能夠更為便捷地對(duì) Java 代碼進(jìn)行測(cè)試。

http://wiki.jikexueyuan.com/project/android-sdk/images/7.png" alt="" />

第三步

現(xiàn)在讓我們運(yùn)行應(yīng)用。運(yùn)行過(guò)程與 Android 應(yīng)用存在些許不同,但我們會(huì)在稍后繼續(xù)進(jìn)行說(shuō)明。選擇“Run”,而后選擇“Run Configurations”。在彈出的列表左側(cè)選擇“Java Application”并點(diǎn)擊上方的“New launch configuration”。如果這是我們的惟一一個(gè) Java 應(yīng)用,Eclipse 會(huì)自動(dòng)選擇運(yùn)行剛剛創(chuàng)建完成的小小成果。

現(xiàn)在點(diǎn)擊“Run”來(lái)運(yùn)行我們的應(yīng)用程序。大家會(huì)看到,編輯器下方的控制臺(tái)視圖中將顯示出數(shù)字“5”。大家可以利用這種方式在學(xué)習(xí)過(guò)程中對(duì) Java 代碼進(jìn)行測(cè)試。

大家現(xiàn)在可以通過(guò)工具欄中的“Run”按鈕隨時(shí)運(yùn)行上一次啟動(dòng)過(guò)的項(xiàng)目。

http://wiki.jikexueyuan.com/project/android-sdk/images/8.png" alt="" />

第四步

無(wú)論何時(shí),只要是在 Java 中進(jìn)行變量聲明,我們都會(huì)使用相同的語(yǔ)法。為了在以后的編程工作中為變量分配不同的值,我們可以通過(guò)名稱對(duì)其進(jìn)行引用:

myNum = 3; 

上述代碼會(huì)覆蓋掉現(xiàn)有值。在 Java 中存在著很多不同的變量類型。其中 int 屬于被引用的基本類型,此外還有一些其它數(shù)字類型;char 用于字符值,而 boolean 則用于保存真假值。對(duì)象的類型也分許多種;關(guān)于對(duì)象的話題,我們放在以后進(jìn)行討論。對(duì)于大家來(lái)說(shuō),最熟悉的基本對(duì)象類型應(yīng)該要數(shù) String 了,它的作用是保存一條文本字符串:

String myName = "Sue"; 

文本字符串值要用引號(hào)括起來(lái)。大家可以在正面的例子中看到它的使用方法:

System.out.println("number: " + myNum); 

添加上述代碼并運(yùn)行,控制臺(tái)會(huì)顯示“number:”再加上變量值。

第五步

在上面我們看到了賦值運(yùn)算符“=”——正面我們?cè)賮?lái)看其它一些常見(jiàn)運(yùn)算符:

 //add 
myNum = 5+6; 
//subtract 
myNum = 7-3; 
//multiply 
myNum = 3*2; 
//divide 
myNum = 10/5; 
//remainder 
myNum = 10%6; 
//increment (add one) 
myNum++; 
//decrement (subtract one) 
myNum--; 

運(yùn)算符既可以被用在變量當(dāng)中,也可以作為硬編碼數(shù)字(如上所示):

 int myNum = 5; 
int myOtherNum = 4; 
int total = myNum+myOtherNum;//9 

第六步

作為 Android 基礎(chǔ)內(nèi)容的另一種 Java 結(jié)構(gòu)就是注釋。大家可以通過(guò)以下兩種方式添加注釋:

 //this is a single line comment 
/* This is a multiline comment 
* stretching across lines 
* to give more information 
*/ 

最重要的是養(yǎng)成編寫代碼的同時(shí)添加注釋的好習(xí)慣,這一方面便于我們自己日后查看,另外也能讓其他合作者了解我們的編碼意圖。

2. 控制結(jié)構(gòu)

第一步

我們向主方法中添加的代碼會(huì)在 Java 應(yīng)用程序運(yùn)行時(shí)同時(shí)執(zhí)行。而在運(yùn)行我們所創(chuàng)建的 Android 應(yīng)用程序時(shí),主 Activity 中 onCreate 方法的代碼會(huì)同時(shí)執(zhí)行。這些方法中的所有代碼行都會(huì)按從上到下的順序依次執(zhí)行,不過(guò)執(zhí)行的流程并不總是線性的。Java 當(dāng)中有很多控制結(jié)構(gòu),正面我們就從條件開(kāi)始了解其中最常見(jiàn)的幾種。條件語(yǔ)句一般用于進(jìn)行測(cè)試從而確定執(zhí)行流程。在 Java 當(dāng)中,最簡(jiǎn)單的條件結(jié)構(gòu)就是 if 語(yǔ)句:

if(myNum>3) 
   System.out.println("number is greater than 3"); 

這項(xiàng)測(cè)試的目的在于檢查變量的值是否大于 3。如果確實(shí)大于 3,那么字符串將被寫入輸出結(jié)果。如果小于等于 3,則不向輸出結(jié)果寫入任何內(nèi)容、繼續(xù)執(zhí)行程序中的下一行。條件測(cè)試會(huì)“返回”一個(gè)真假值。真與假都屬于 boolean 值。我們也可以向其中添加 else,這樣其內(nèi)容只會(huì)在返回假值時(shí)才執(zhí)行:

 if(myNum>3) 
    System.out.println("number is greater than 3"); 
else 
    System.out.println("number is not greater than 3"); 

在我們的示例中,else 語(yǔ)句會(huì)在值等于或者小于 3 時(shí)執(zhí)行。嘗試在代碼的整數(shù)變量中添加不同的值,看看條件測(cè)試結(jié)果會(huì)發(fā)生哪些變化:

 if(myNum>10) 
    System.out.println("number is greater than 10"); 
else if(myNum>7) 
    System.out.println("number is greater than 7"); 
else if(myNum>3) 
    System.out.println("number is greater than 3"); 
else 
    System.out.println("number is 3 or less"); 

只有在流程中的每一次測(cè)試中都返回假值時(shí),所有測(cè)試行才會(huì)被徹底執(zhí)行一遍。因此對(duì)于大部分?jǐn)?shù)字來(lái)說(shuō),只會(huì)輸出一條字符串。如果有必要,大家可以把多條 else if 語(yǔ)句串點(diǎn)起來(lái)。大家還可以利用 if 語(yǔ)句與一個(gè)或者多個(gè) else if 相結(jié)合,而不必每一次都在之后單獨(dú)設(shè)置 else。

下面我們測(cè)試一個(gè)數(shù)字是否大于另一個(gè)。嘗試使用以下變量:

 if(myNum<10) 
    System.out.println("number less than 10"); 
if(myNum==10) 
    System.out.println("number equals 10"); 
if(myNum!=10) 
    System.out.println("number is not equal to 10"); 
if(myNum>=10) 
    System.out.println("number either greater than or equal to 10"); 
if(myNum<=10) 
    System.out.println("number either less than or equal to 10"); 

大家也可以利用包含字符串的變量類型進(jìn)行類似的測(cè)試。要同時(shí)進(jìn)行多項(xiàng)測(cè)試,可以利用以下語(yǔ)法:

if(myNum>=10 && myNum<=50) 
    System.out.println("number is between 10 and 50"); 

其中的“&&”是作為“and”運(yùn)算符存在的,意思是整條語(yǔ)句只有在兩項(xiàng)測(cè)試都返回真值時(shí)才被判定為真。而“or”運(yùn)算符將在兩條測(cè)試中任意一條返回真值時(shí)判定為真:

if(myNum<0 || myNum!=-1) 
   System.out.println("number is less than 0 or not equal to -1"); 

為了將代碼組成代碼塊,我們可以使用大括號(hào)——兩個(gè)括號(hào)之間的所有代碼都會(huì)在測(cè)試返回真值時(shí)執(zhí)行:

 if(myNum<10) 
{ 
    System.out.println("number less than 10"); 
    myNum=10; 
} 

這些括號(hào)能夠在循環(huán)、方法以及類中實(shí)現(xiàn)代碼分組。

第二步

接下來(lái)讓我們看看循環(huán)。下面的 for 循環(huán)會(huì)進(jìn)行十次遍歷,意味著它的內(nèi)容將執(zhí)行十次:

  for(int i=0; i<10; i++){ 
    System.out.println(i); 
} 

在 for 循環(huán)中的第一個(gè)表達(dá)式旨在將一個(gè)整數(shù)型計(jì)數(shù)器變量初始化為零。第二個(gè)表達(dá)式則是條件測(cè)試,檢查該變量的值是否小于 10。如果返回的是真值,則循環(huán)內(nèi)容得到執(zhí)行;如果返回的是假值,則中止循環(huán)。一旦循環(huán)當(dāng)中的內(nèi)容開(kāi)始執(zhí)行,第三個(gè)表達(dá)式就同時(shí)執(zhí)行,即遞增計(jì)數(shù)器。

另一種循環(huán) while 所使用的語(yǔ)法稍有區(qū)別。以下代碼就是我們利用 while 來(lái)實(shí)現(xiàn)上面的 for 循環(huán)的相同執(zhí)行效果:

 int i=0; 
while(i<10){ 
    System.out.println(i); 
    i++; 
} 

循環(huán)當(dāng)中可以容納多行代碼,其中包括其它循環(huán)。

第三步

我們已經(jīng)接觸了主方法與 Android 的 onCreate 方法。下面讓我們一起學(xué)習(xí)如何創(chuàng)建自己的方法。將以下方法放置在主方法的右括號(hào)之后:

 public static void doSomething(){ 
    System.out.println("something"); 
} 

該方法被定義為 public,這意味著項(xiàng)目中的所有類都可以調(diào)用其進(jìn)程。如果它的屬性為“private”,則代表只供同一個(gè)類內(nèi)部進(jìn)行訪問(wèn)(也就是‘visibility’)。一般來(lái)說(shuō),大家不會(huì)在自己的第一個(gè) Android 應(yīng)用中包含“static”修飾符,因此忽略掉它即可。而“void”代表著返回類型。在我們的示例中,該方法不會(huì)返回任何值。為了執(zhí)行該方法,我們需要在主方法中添加一項(xiàng)調(diào)用:

doSomething(); 

運(yùn)行應(yīng)用程序并查看其功能——改變方法以返回一個(gè)值:

public static int doSomething(){ return 5; } 改變方法調(diào)用并再次運(yùn)行:

System.out.println(doSomething()); 

返回的值會(huì)被寫出。方法還可以接收參數(shù):

public static int doSomething(int firstNum, int secondNum){ 
    return firstNum*secondNum; 
} 

在調(diào)用該方法時(shí),大家必須符合正確的參數(shù)類型與數(shù)字:

System.out.println(doSomething(3, 5)); 

方法能夠?qū)?yīng)用程序進(jìn)程拆分為邏輯塊。如果大家需要多次執(zhí)行同一項(xiàng)任務(wù),那么它們的作用將非常重要;我們可以簡(jiǎn)單在方法中進(jìn)行定義,然后在需要時(shí)隨時(shí)調(diào)用。如果各位需要改變處理流程,也只需在方法代碼中進(jìn)行修改。

3. 類與對(duì)象

第一步

我們已經(jīng)了解了方法如何被用于重新使用代碼并將其拆分成邏輯部分。類與對(duì)象則能夠在更大的范圍內(nèi)實(shí)現(xiàn)此類功能。大家可以將應(yīng)用中的任務(wù)劃分成不同對(duì)象,其中每個(gè)對(duì)象都由它所歸屬的類為其定義一系列職責(zé)。這類似于用一種方法負(fù)責(zé)一個(gè)特定功能區(qū)域,不過(guò)一個(gè)對(duì)象可以擁有多個(gè)方法而且能夠保存數(shù)據(jù)值。

想象我們正在創(chuàng)建一款游戲——大家可以創(chuàng)建一個(gè)專門用來(lái)處理用戶詳細(xì)信息的類。在 Package Explorer 中選擇我們的應(yīng)用程序包,右鍵點(diǎn)擊并選擇“New”而后是“Class”。輸入“GameUser”作為類名稱,確保 main method stub 復(fù)選框沒(méi)有被勾選,然后點(diǎn)擊“Finish”。Eclipse 會(huì)打開(kāi)這個(gè)類文件,在初始狀態(tài)下其中只包含它的類聲明概要:

  public class GameUser { 
//class content 
} 

大家所添加的所有內(nèi)容都應(yīng)該位于兩個(gè)大括號(hào)之間(除非大家添加導(dǎo)入語(yǔ)句,這部分內(nèi)容將位于最前方)。我們的 Android 應(yīng)用會(huì)識(shí)別出羅列于文件開(kāi)頭的包名稱。當(dāng)然這里我們使用的是默認(rèn)包,所以前面并沒(méi)有列出其它內(nèi)容。

第二步

在這個(gè)類當(dāng)中添加以下變量:

private String playerName; 
rivate int score; 

這些被稱為“實(shí)例變量”,因?yàn)樗鼈儽欢x為我們所創(chuàng)建的類中的實(shí)例。在它們之后添加一個(gè)構(gòu)造方法,它會(huì)在該類中的某個(gè)對(duì)象被創(chuàng)建后開(kāi)始執(zhí)行:

public GameUser(String userName, int userScore){ 
   playerName=userName; 
   score=userScore; 

這里的構(gòu)造永遠(yuǎn)與類使用同樣的名稱,而且可能要求也可能不要求使用參數(shù)。該構(gòu)造通常應(yīng)該向?qū)嵗兞糠峙渲担话闶峭ㄟ^(guò)參數(shù)來(lái)實(shí)現(xiàn)。

第三步

類也可以定義方法。將以下典型集合添加到構(gòu)造之后:

  public String getName() {return playerName;} 
public int getScore() {return score;} 
public void setName(String newName) {playerName=newName;} 
public void setScore(int newScore) {score=newScore;} 

這些被稱為 get 與 set 方法,或者叫 getter 與 setter,因?yàn)樗鼈儠?huì)利用接收及發(fā)送實(shí)例變量值的能力將外部代碼添加到類中來(lái)。查看 Eclipse 中的 Outline 視圖,理解它如何幫助實(shí)現(xiàn)導(dǎo)航類內(nèi)容。

http://wiki.jikexueyuan.com/project/android-sdk/images/9.png" alt="" />

第四步

保存我們新建的類文件?;氐街黝惍?dāng)中,為新類在主方法中創(chuàng)建一個(gè)對(duì)象:

GameUser aUser = new GameUser("Jim", 0);

我們符合構(gòu)造當(dāng)中的參數(shù)要求——以上代碼中的“new”關(guān)鍵字將使構(gòu)造開(kāi)始執(zhí)行?,F(xiàn)在我們可以使用這個(gè)類實(shí)例,通過(guò)調(diào)用其方法訪問(wèn)其中的數(shù)據(jù):

System.out.println(aUser.getScore()); 
aUser.setScore(5); 
System.out.println(aUser.getScore()); 

運(yùn)行程序以查看調(diào)用對(duì)象上的 public 方法之后,值產(chǎn)生了什么樣的變化。大家可以創(chuàng)建多個(gè)對(duì)象實(shí)例,并對(duì)它們進(jìn)行分別管理:

GameUser anotherUser = new GameUser("Jane", 5); 

4. 繼承與界面

第一步

我們已經(jīng)了解了如何通過(guò)創(chuàng)建對(duì)象實(shí)例來(lái)使類定義一系列職責(zé)。它的效果不僅作用于我們所創(chuàng)建的類本身,同時(shí)也作用于其它我們能夠使用的現(xiàn)有 Java 及 Android 類。除此之外,在創(chuàng)建這些平臺(tái)類實(shí)例的同時(shí),大家還可以利用繼承對(duì)其加以擴(kuò)展。在繼承機(jī)制的幫助下,我們可以創(chuàng)建出一個(gè)繼承現(xiàn)有類功能、同時(shí)又擁有自己運(yùn)行流程的類。在我們所創(chuàng)建的第一個(gè) Android 項(xiàng)目中,主 Activity 類就是一個(gè)很好的例子。

現(xiàn)在打開(kāi) Android 項(xiàng)目中的這個(gè)類。在類聲明的開(kāi)頭,大家會(huì)看到“extends Activity”。這意味著該類屬于 Android Activity 類中的一個(gè)子類。這里的 Activity 類用于使 Android 系統(tǒng)處理向用戶呈現(xiàn)的屏幕內(nèi)容,而各方法則用于不同變量狀態(tài)下的屏幕內(nèi)容(創(chuàng)建、暫停與消除等)。通過(guò)向 Android Activity 類聲明中的定義方法添加代碼并在必要時(shí)增加額外方法的方式,我們能夠更專注于實(shí)現(xiàn)應(yīng)用程序的獨(dú)特風(fēng)格。

這是我們經(jīng)常會(huì)在 Android 上使用的模式,用于為應(yīng)用程序的常見(jiàn)需要擴(kuò)展定義類。大家可以用自己的類適當(dāng)對(duì)其加以補(bǔ)充。

第二步

再來(lái)看 Activity 類中的起始行。請(qǐng)記住,我們添加了“implements OnClickLisener”來(lái)處理 UI 中的按鈕點(diǎn)擊操作。這將通過(guò)引用被實(shí)施在界面當(dāng)中。界面類似于一個(gè)我們利用“extends”繼承而來(lái)的類,只不過(guò)界面聲明只需簡(jiǎn)單羅列方法概述。大家需要對(duì)每一項(xiàng)概述進(jìn)行方法實(shí)施。因此當(dāng)我們實(shí)施 OnClickListener 時(shí),需要委托該類提供一個(gè) onClick 方法——正如我們?cè)谥暗?Android 項(xiàng)目中所做。因此界面類似于一項(xiàng)協(xié)定。在繼承機(jī)制的輔助下,擴(kuò)展類能夠繼承由類聲明所提供的、用于實(shí)現(xiàn)超類(即經(jīng)過(guò)擴(kuò)展的類)的方法實(shí)施。如果需要,大家可以覆蓋這些實(shí)施內(nèi)容。

總結(jié)

在今天的教程中,我們簡(jiǎn)要介紹了一些 Java 語(yǔ)法方面的基本知識(shí)。當(dāng)然,還有很多其它關(guān)于 Java 的結(jié)構(gòu)與概念需要了解。如果大家此前沒(méi)有接觸過(guò) Java,又希望保證自己能擁有足以順利應(yīng)對(duì) Android 開(kāi)發(fā)工作的必要知識(shí),請(qǐng)務(wù)必點(diǎn)擊此處認(rèn)真閱讀甲骨文公司發(fā)布的 Java 指南。其中需要認(rèn)真學(xué)習(xí)的主題包括數(shù)組與交換語(yǔ)句。在本系列的后續(xù)文章中,我們將探討一些大家最常用到的 Android 類。而在下一章節(jié)中,我們則開(kāi)始探索 Android 應(yīng)用項(xiàng)目中的資源。

原文鏈接: http://mobile.tutsplus.com/tutorials/android/android-sdk-java-application-programming/