1、簡介 註:本文代碼參考 我們將開發本系列第一個應用,並藉此學習一些Android基本概念以及構成應用的UI組件。 初學習,如果沒能全部理解,也不必擔心,後續還會涉及這些內容並有更加詳細的講解。 馬上要開發的應用名叫GeoQuiz,它能給出一道道地理知識問題。用戶點擊TRUE或FALSE 按鈕來回 ...
1、簡介
註:本文代碼參考
我們將開發本系列第一個應用,並藉此學習一些Android基本概念以及構成應用的UI組件。
初學習,如果沒能全部理解,也不必擔心,後續還會涉及這些內容並有更加詳細的講解。
馬上要開發的應用名叫GeoQuiz,它能給出一道道地理知識問題。用戶點擊TRUE或FALSE
按鈕來回答屏幕上的問題,GeoQuiz即時作出反饋。
下圖顯示了用戶點擊TRUE按鈕的結果:
用戶點擊TRUE按鈕圖,圖1
1.1、Activity和佈局文件
GeoQuiz應用由一個activity和一個佈局(layout)組成。
- activity是Android SDK中 Activity類的一個實例,負責管理用戶與應用界面的交互。
- 應用的功能是通過編寫 Activity 子類來實現的。對於簡單的應用來說,一個 Activity 子
類可能就夠了,而複雜的應用則會有多個。 GeoQuiz是個簡單應用,因此它只有一個名叫 QuizActivity 的 Activity
子類。 QuizActivity它所對應的 用戶界面。 - 佈局定義了一系列用戶界面對象以及它們顯示在屏幕上的位置。組成佈局的定義保存在
XML文件中。每個定義用來創建屏幕上的一個對象,如按鈕或文本信息。
GeoQuiz應用包含一個名叫activity_quiz.xml的佈局文件。該佈局文件中的XML標簽定義了
具體的用戶界面。
QuizActivity 與activity_quiz.xml文件的關係如下圖2所示:
Activity java文件與佈局xml文件對應關係圖:
1.2、用戶界面設計
Android Studio如何創建項目以及Android Studio的界面介紹這裡不贅述,我們通過Android Studio(以後簡稱“AS”)創建好GeoQuiz應用後,首先打開app/res/layout/activity_quiz.xml文件。如果看到的是佈局預覽界面,請點擊底部的
Text頁切換顯示XML代碼。
當前,activity_quiz.xml文件定義了預設的activity佈局。
應用activity的預設佈局定義了兩個組件(widget): RelativeLayout 和 TextView 。
組件是用戶界面的構造模塊。組件可以顯示文字或圖像,與用戶交互,甚至佈置屏幕上的其
他組件。按鈕、文本輸入控制項和選擇框等都是組件。
Android SDK內置了多種組件,通過配置各種組件可獲得所需的用戶界面及行為。每一個組
件都是 View 類或其子類(如 TextView 或 Button )的一個具體實例。
RelativeLayout 和 TextView 是在屏幕上的顯示圖 圖3:
QuizActivity 的用戶界面需要下列組件:
- 一個垂直 LinearLayout 組件;
- 一個 TextView 組件;
- 一個水平 LinearLayout 組件;
- 兩個 Button組件。
組件是如何構成 QuizActivity 用戶界面圖 圖4:
下麵我們在activity_quiz.xml文件中定義這些組件。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="24dp"
android:text="@string/question_text" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/true_button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/false_button" />
</LinearLayout>
</LinearLayout>
上述代碼暫時不理解也沒關係,後續學習中逐漸弄明白的。
註意,開發工具無法校驗佈局XML內容,拼寫錯誤早晚會出問題,應儘量避免。
可以看到,有三行以 android:text 開頭的代碼出現了錯誤信息。暫時忽略它們,稍後會
處理。
對照上圖用戶界面查看XML文件,可以看出組件與XML元素一一對應。元素的名
稱就是組件的類型。
各元素均有一組XML屬性。屬性可以看作如何配置組件的指令。
為方便理解元素與屬性的工作原理,接下來我們將以層級視角來研究佈局。
1.2.1、視圖層級結構
組件包含在視圖(View)對象的層級結構中,這種結構又稱作視圖層級結構(view hierarchy)。
上述代碼所示的XML佈局對應的視圖層級結構圖 圖5:
從佈局的視圖層級結構可以看到,其根元素是一個 LinearLayout 組件。作為根元素,
LinearLayout 組件必須指定Android XML資源文件的命名空間屬性,這裡是http://schemas.
android.com/apk/res/android。
LinearLayout 組件繼承自 ViewGroup 組件(也是個 View 子類)。 ViewGroup 組件是包含並配
置其他組件的特殊組件。想要以一列或一排的樣式佈置組件,就可以使用 LinearLayout 組件。
其他 ViewGroup 子類還有 FrameLayout 、 TableLayout 和 RelativeLayout 。
若某個組件包含在一個 ViewGroup 中,該組件與 ViewGroup 即構成父子關係。根 Linear-
Layout 有兩個子組件: TextView 和另一個 LinearLayout 。作為子組件的 LinearLayout 自己還
有兩個 Button 子組件。
1.2.2、組件屬性
看看配置組件時常用的一些屬性。
- android:layout_width 和 android:layout_height 屬性
幾乎每類組件都需要 android:layout_width 和 android:layout_height 屬性。以下是它
們的兩個常見屬性值(二選一)。
match_parent :視圖與其父視圖大小相同。
wrap_content :視圖將根據其顯示內容自動調整大小。
(以前還有個 fill_parent 屬性值,等同於 match_parent ,現已廢棄不用。)
根 LinearLayout 組件的高度與寬度屬性值均為 match_parent 。 LinearLayout 雖然是根元
素,但它也有父視圖——Android提供該父視圖來容納應用的整個視圖層級結構。
其他包含在界面佈局中的組件,其高度與寬度屬性值均被設置為 wrap_content 。
TextView 組件比其包含的文字內容區域稍大一些,這主要是 android:padding="24dp" 屬性
的作用。該屬性告訴組件在決定大小時,除內容本身外,還需增加額外指定量的空間。這樣屏幕
上顯示的問題與按鈕之間便會留有一定的空間,使整體顯得更為美觀。(不理解dp的意思?dp即
density-independent pixel,指與密度無關的像素。)
2. android:orientation 屬性
android:orientation 屬性是兩個 LinearLayout 組件都具有的屬性,它決定兩者的子組件
是水平放置還是垂直放置。根 LinearLayout 是垂直的,子 LinearLayout 是水平的。
子組件的定義順序決定其在屏幕上顯示的順序。在垂直的 LinearLayout 中,第一個定義的
子組件出現在屏幕的最上端;而在水平的 LinearLayout 中,第一個定義的子組件出現在屏幕的
最左端。(如果設備文字從右至左顯示,如阿拉伯語或者希伯來語,第一個定義的子組件則出現
在屏幕的最右端。)
3. android:text 屬性
TextView 與 Button 組件具有 android:text 屬性。該屬性指定組件要顯示的文字內容。
請註意, android:text 屬性值不是字元串值,而是對字元串資源(string resource)的引用。
字元串資源包含在一個獨立的名叫strings的XML文件中(strings.xml),雖然可以硬編碼設置
組件的文本屬性值,如 android:text="True" ,但這通常不是個好主意。
比較好的做法是:將文
字內容放置在獨立的字元串資源XML文件中,然後引用它們。這樣會方便應用的本地化(支持
多國語言)。
需要在activity_quiz.xml文件中引用的字元串資源還沒添加。現在就來處理。
1.2.3、創建字元串資源
每個項目都包含一個預設字元串資源文件strings.xml。
在項目工具視窗中,找到app/res/values目錄,展開目錄,打開strings.xml文件。
可以看到,項目模板已經添加了一些字元串資源。如下代碼所示,添加應用佈局需要
的三個新的字元串。
<resources>
<string name="app_name">GeoQuiz</string>
<string name="question_text">Canberra is the capital of Australia.</string>
<string name="true_button">True</string>
<string name="false_button">False</string>
</resources>
(某些版本的Android Studio的strings.xml預設帶有其他字元串,請勿刪除它們,否則會引發與
其他文件的聯動錯誤。)
現在,在GeoQuiz項目的任何XML文件中,只要引用到 @string/false_button ,應用運行
時,就會得到文本“False”。
保存strings.xml文件。這時,activity_quiz.xml佈局缺少字元串資源的提示信息應該就消失了。
(如仍有錯誤提示,請檢查一下這兩個文件,確認沒有拼寫錯誤。)
預設的字元串文件雖然已命名為strings.xml,仍可以按個人喜好重命名。一個項目也可以
有多個字元串文件。只要這些文件都放在res/values/目錄下,含有一個 resources 根元素,以及多
個 string 子元素,應用就能找到並正確使用它們。
1.3、從佈局 XML 到視圖對象
知道activity_quiz.xml中的XML元素是如何轉換為視圖對象的嗎?答案就在於 QuizActivity
類。
在創建GeoQuiz項目的同時,嚮導也創建了一個名叫 QuizActivity 的 Activity 子類。
QuizActivity 類文件存放在項目的app/java目錄下。java目錄是項目全部Java源代碼的存放處。
在項目工具視窗中,依次展開app/java目錄與com.bignerdranch.android.geoquiz包。找到並打
開QuizActivity.java文件,查看其中的代碼,如下所示:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class QuizActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
}
}
是不是不明白 AppCompatActivity 的作用?它實際就是一個 Activity 子類,能為Android
舊版本系統提供相容支持。
如果無法看到全部類包導入語句,請單擊第一行導入語句左邊的⊕符號來顯示它們。
該Java類文件有一個 Activity 方法: onCreate(Bundle) 。
(如果你的文件還包含 onCreateOptionsMenu(Menu) 和 onOptionsItemSelected(MenuItem)
方法,暫時不用理會)
activity子類的實例創建後, onCreate(Bundle) 方法會被調用。activity創建後,它需要獲取
並管理用戶界面。要獲取activity的用戶界面,可調用以下 Activity 方法:
public void setContentView(int layoutResID)
根據傳入的佈局資源ID參數,該方法生成指定佈局的視圖並將其放置在屏幕上。佈局視圖生
成後,佈局文件包含的組件也隨之以各自的屬性定義完成實例化。
1.3.1、資源與資源 ID
佈局是一種資源。資源是應用非代碼形式的內容,如圖像文件、音頻文件以及XML文件等。
項目的所有資源文件都存放在目錄app/res的子目錄下。在項目工具視窗中可以看到,
activity_quiz.xml佈局資源文件存放在res/layout/目錄下。strings.xml字元串資源文件存放在
res/values/目錄下。
可以使用資源ID在代碼中獲取相應的資源。activity_quiz.xml佈局的資源ID為R.layout.
activity_quiz。
查看GeoQuiz應用的資源ID需要切換項目視圖。Android Studio預設使用Android項目視圖,
圖6所示。為讓開發者專註於最常用的文件和目錄,預設視圖隱藏了Android項目的真實文件
目錄結構。
圖6:
在項目工具視窗的最上部找到下拉菜單,從Android項目視圖切換至Project視圖。Project視圖
會顯示出當前項目的所有文件和目錄。
展開目錄app/build/generated/source/r/debug,找到項目包名稱並打開其中的R.java文件,即可
看到GeoQuiz應用當前所有的資源。R.java文件在Android項目編譯過程中自動生成,如該文件頭
部的警示所述,請不要修改該文件的內容。
修改佈局或字元串等資源後,R.java文件不會實時刷新。Android Studio另外還存有一份代碼
編譯用的R.java隱藏文件。當前代碼編輯區打開的R.java文件僅在應用安裝至設備或模擬器前產
生,因此只有在Android Studio中點擊運行應用時,它才會得到更新。
R.java文件通常比較大,如下所示:
/* 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 anim {
...
}
...
public static final class id {
...
}
public static final class layout {
...
public static final int activity_quiz=0x7f030017;
}
public static final class mipmap {
public static final int ic_launcher=0x7f030000;
}
public static final class string {
...
public static final int app_name=0x7f0a0010;
public static final int false_button=0x7f0a0012;
public static final int question_text=0x7f0a0014;
public static final int true_button=0x7f0a0015;
}
}
可以看到R.layout.activity_quiz即來自該文件。 activity_quiz 是 R 的內部類 layout 里的一個
整型常量名。
GeoQuiz應用需要的字元串同樣具有資源ID。目前為止,我們還未在代碼中引用過字元串,
如果需要,可以使用以下方法:
setTitle(R.string.app_name);
Android為整個佈局文件以及各個字元串生成資源ID,但activity_quiz.xml佈局文件中的組件
除外,因為不是所有組件都需要資源ID。在本章中,我們要在代碼里與兩個按鈕交互,因此只需
為它們生成資源ID即可。
這裡主要使用Android項目視圖,生成資源ID之前,記得切回。當然,如果你就喜歡使用Project
視圖,也沒啥問題。
要為組件生成資源ID,請在定義組件時為其添加 android:id 屬性。在activity_quiz.xml文件
中,分別為兩個按鈕添加上 android:id 屬性,如下代碼所示:
<LinearLayout ... >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="24dp"
android:text="@string/question_text" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/true_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/true_button" />
<Button
android:id="@+id/false_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/false_button" />
</LinearLayout>
</LinearLayout>
註意, android:id 屬性值前面有一個+標誌,而 android:text 屬性值則沒有。這是因為我
們在創建資源ID,而對字元串資源只是做引用。
1.4、組件的實際應用
按鈕有了資源ID,就可以在 QuizActivity 中直接獲取它們。首先,在QuizActivity.java文件
中增加兩個成員變數。
在QuizActivity.java文件中輸入代碼:
public class QuizActivity extends AppCompatActivity {
private Button mTrueButton;
private Button mFalseButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
}
}
文件保存後,會看到兩個錯誤提示。沒關係,稍後會處理。請註意新增的兩個成員(實例)
變數名稱的 m 首碼。該首碼是Android編程應遵循的命名約定。
現在,將滑鼠移至代碼左邊的錯誤提示處時,會看到兩條同樣的錯誤信息:Cannot resolve
symbol 'Button'。
這告訴我們,需要在QuizActivity.java文件中導入 android.widget.Button 類包。可在文件
頭部手動輸入以下代碼:
import android.widget.Button;
或者使用Option+Return(Alt+Enter)組合鍵,讓Android Studio自動為你導入。代碼有誤時,
也可以使用該組合鍵來修正。記得要常用。
類包導入後,剛纔的錯誤提示應該就消失了。(如果仍然存在,請檢查Java代碼以及XML文
件,確認是否存在輸入或拼寫錯誤。)
接下來,我們來編碼使用按鈕組件,這需要以下兩個步驟:
- 引用生成的視圖對象;
- 為對象設置監聽器,以響應用戶操作。
1.4.1 引用組件
在activity中,可調用以下 Activity 方法引用已生成的組件:
public View findViewById(int id)
該方法以組件的資源ID作為參數,返回一個視圖對象。
在QuizActivity.java文件中,使用按鈕的資源ID獲取視圖對象,賦值給對應的成員變數。註意,賦值前,必須先將返回的 View 類型轉換為 Button 。
public class QuizActivity extends AppCompatActivity {
private Button mTrueButton;
private Button mFalseButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
mTrueButton = (Button) findViewById(R.id.true_button);
mFalseButton = (Button) findViewById(R.id.false_button);
}
}
1.4.2 設置監聽器
Android應用屬於典型的事件驅動類型。不像命令行或腳本程式,事件驅動型應用啟動後,
即開始等待行為事件的發生,如用戶點擊某個按鈕。(事件也可以由操作系統或其他應用觸發,
但用戶觸發的事件更直觀,如點擊按鈕。)
應用等待某個特定事件的發生,也可以說應用正在“監聽”特定事件。為響應某個事件而創
建的對象叫作監聽器(listener)。監聽器會實現特定事件的監聽器介面(listener interface)。
無需自己動手,Android SDK已經為各種事件內置了很多監聽器介面。當前應用需要監聽用
戶的按鈕“點擊”事件,因此監聽器需實現 View.OnClickListener 介面。
首先處理TRUE按鈕。在QuizActivity.java文件中,在 onCreate(Bundle) 方法的變數賦值語
句後輸入下列代碼
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
mTrueButton = (Button) findViewById(R.id.true_button);
mTrueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Does nothing yet, but soon!
}
});
mFalseButton = (Button) findViewById(R.id.false_button);
}
(如果遇到View cannot be resolved to a type的錯誤提示,請使用Option+Return(Alt+Enter)快
捷鍵導入 View 類。)
在上面代碼中,我們設置了一個監聽器。按鈕 mTrueButton 被點擊後,監聽器會立即通
知我們。傳入 setOnClickListener(OnClickListener) 方法的參數是一個監聽器。它是一個實
現了 OnClickListener 介面的對象。
使用匿名內部類
這裡,一個匿名內部類(anonymous inner class)實現了 OnClickListener 介面。語法看上去
稍顯複雜,不過有個助記小技巧:最外層一對括弧內的全部代碼就是傳入 setOnClickListener
(OnClickListener) 方法的參數。
mTrueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Does nothing yet, but soon!
}
});
後續所有的監聽器都以匿名內部類來實現。這樣做有兩大好處:
- 第一,使用匿名內部類,可 以相對集中地實現監聽器方法,一眼可見;
- 第二,事件監聽器一般只在一個地方使用,使用匿名
內部類,就不用去創建繁瑣的命名類了。
匿名內部類實現了 OnClickListener 介面,因此它也必須實現該介面唯一的 onClick(View)
方法。 onClick(View) 現在是個空方法。雖然必須實現 onClick(View) 方法,但具體如何實現取
決於使用者,因此即使是個空方法,編譯器也可以編譯通過。
(如果匿名內部類、監聽器、介面等概念已忘得差不多了,現在就該去複習一下,或找本參
考手冊備查。)
1.5、創建提示消息
接下來要實現的是,分別點擊兩個按鈕,彈出我們稱之為toast的提示消息。Android的toast
是用來通知用戶的簡短彈出消息,用戶無需輸入什麼,也不用做任何干預操作。這裡,我們要用
toast來反饋答案,如圖7所示:
首先回到strings.xml文件,如下代碼所示,為toast添加消息顯示用的字元串資源。
<resources>
<string name="app_name">GeoQuiz</string>
<string name="question_text">Canberra is the capital of Australia.</string>
<string name="true_button">True</string>
<string name="false_button">False</string>
<string name="correct_toast">Correct!</string>
<string name="incorrect_toast">Incorrect!</string>
</resources>
調用 Toast 類的以下方法,可創建toast:
public static Toast makeText(Context context, int resId, int duration)
該方法的 Context 參數通常是 Activity 的一個實例( Activity 本身就是 Context 的子類)。
第二個參數是toast要顯示字元串消息的資源ID。 Toast 類必須藉助 Context 才能找到並使用字元
串資源ID。第三個參數通常是兩個 Toast 常量中的一個,用來指定toast消息的停留時間。
創建toast後,可調用 Toast.show() 方法在屏幕上顯示toast消息。
在 QuizActivity 代碼里,分別調用 makeText(...) 方法。在添加
makeText(...) 時,可利用Android Studio的代碼自動補全功能,讓代碼輸入更輕鬆。
使用代碼自動補全
代碼自動補全功能可以節約大量開發時間,越早掌握受益越多。
依次輸入下麵代碼。當輸入到 Toast 類後的點號時,Android Studio會彈出一
個視窗,視窗內顯示了建議使用的 Toast 類的常量與方法。
要選擇需要的建議方法,使用上下鍵。(如果不想使用代碼自動補全功能,請不要按Tab鍵、
Return/Enter鍵,或使用滑鼠點擊彈出視窗,只管繼續輸入代碼直至完成。)
在建議列表裡,選擇 makeText(Context context, int resID, int duration) 方法,代
碼自動補全功能會自動添加完整的方法調用。
完成 makeText 方法的全部參數設置,完成後的代碼如下代碼所示:
mTrueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(QuizActivity.this,
R.string.correct_toast,
Toast.LENGTH_SHORT).show();
// Does nothing yet, but soon!
}
});
mFalseButton = (Button) find ViewById(R.id.false_button);
mFalseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(QuizActivity.this,
R.string.incorrect_toast,Toast.LENGTH_SHORT).show();
}
});
在 makeText(...) 里,傳入 QuizActivity 實例作為 Context 的參數值。註意此處應輸入的
參數是 QuizActivity.this ,不要想當然地直接輸入 this 。因為匿名類的使用,這裡的 this 指
的是監聽器 View.OnClickListener 。
使用代碼自動補全功能,自己也就不用導入 Toast 類了,因為Android Studio會自動導入相
關類。
好了,現在可以運行應用了。
1.6、 使用模擬器運行應用
運行Android應用需使用硬體設備或虛擬設備(virtual device)。包含在開發工具中的Android
設備模擬器可提供多種虛擬設備。
要創建Android虛擬設備(AVD),在Android Studio中,選擇Tools → Android → AVD Manager
菜單項。AVD管理器視窗彈出時,點擊視窗左下角的+Create Virtual Device…按鈕。一路next,詳細的創建不贅述了。
創建完成後即可啟動運行。
AVD創建成功後,我們用它運行GeoQuiz應用。點擊Android Studio工具欄上的Run按鈕,或
者使用Control+R快捷鍵。Android Studio會自動找到新建的虛擬設備,安裝應用包(APK),然後
啟動並運行應用。
模擬器的啟動過程比較耗時,請耐心等待。等設備啟動完成,應用運行後,就可以在應用界
面點擊按鈕,讓toast告訴你答案了。
假如啟動時或在點擊按鈕時,GeoQuiz應用崩潰,可以在Android DDMS工具視窗的LogCat
視圖中看到有用的診斷信息。(如果LogCat沒有自動打開,可點擊Android Studio視窗底部的
Android Monitor按鈕打開它。),查看日誌。
最好不要關掉模擬器,這樣就不必在反覆運行調試應用時,浪費時間等待AVD啟動了。
單擊AVD模擬器上的後退按鈕可以停止應用。這個後退按鈕的形狀像一個指向左側的三角形
(在較早版本的Android中,它像一個U型箭頭)。需要調試變更時,再通過Android Studio重新運
行應用。
模擬器雖然好用,但在實體設備上測試應用能獲得更準確的結果。
1.7、深入學習:Android 編譯過程
學習到這裡,你可能迫切想知道Android是如何編譯的。
你已經知道在項目文件發生變化時,
Android Studio無需指示便會自動進行編譯。
在整個編譯過程中,Android開發工具將資源文件、
代碼以及AndroidManifest.xml文件(包含應用的元數據)編譯生成.apk文件。.apk文件要在模擬器上
運行,還需以debug key簽名。(分發.apk應用給用戶時,應用必須以release key簽名。更多有關編譯
過程的信息,可參考Android開發文檔網頁developer.android.com/tools/publishing/preparing.html。)
那麼,應用的activity_quiz.xml佈局文件的內容該如何轉變為 View 對象呢?作為編譯過程的
一部分,aapt(Android Asset Packaging Tool)將佈局文件資源編譯壓縮緊湊後,打包到.apk文件
中。
然後,在 QuizActivity 類的 onCreate(Bundle) 方法調用 setContentView(...) 方法時,
QuizActivity 使用 LayoutInflater 類實例化佈局文件中定義的每一個 View 對象,如圖8所示:
1.7.1、Android 編譯工具
當前,我們看到的項目編譯都是在Android Studio里執行的。編譯功能已整合到IDE中,IDE
負責調用aapt等Android標準編譯工具,但編譯過程本身仍由Android Studio管理。
有時,出於某種原因,可能需要脫離Android Studio編譯代碼。最簡單的方法是使用命令行
編譯工具。現代Android編譯系統使用Gradle編譯工具
要從命令行使用Gradle,請切換到項目目錄並執行以下命令:
$ ./gradlew tasks
如果是Windows系統,執行以下命令:
gradlew.bat tasks
執行以上命令會顯示一系列可用任務。你需要的任務是installDebug,因此,再執行以下命令:
$ ./gradlew installDebug
如果是Windows系統,執行以下命令:
gradlew.bat installDebug
以上命令將把應用安裝到當前連接的設備上,但不會運行它。要運行應用,需要在設備上手
動啟動。