以一個小程式設計來入門Android
如果初次接觸Android內容的話,首先可以從Android的一些基本概念以及一些基本的UI元件開始,作為Android的入門吧。
本應用由一個activity和一個佈局(layout)組成。
activity是Android SDK中Activity類的一個例項,負責管理使用者與應用介面的互動。 應用的功能是通過編寫Activity子類來實現的。對於簡單的應用來說,一個Activity子類可能就夠了,而複雜的應用則會有多個。
佈局定義了一系列使用者介面物件以及它們顯示在螢幕上的位置。組成佈局的定義儲存在 XML檔案中。每個定義用來建立螢幕上的一個物件,如按鈕或文字資訊。
安裝和建立Android專案就不必再說了,不是特別複雜,按照步驟一步一步走問題不大。
下面總結介紹一些基本的操作。
1. 使用者介面設計
首先開啟app/res/layout/activity_quiz.xml檔案。比如在本例中形成的程式碼如下:
<LinearLayout xmlns:android = "ofollow,noindex">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: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>
應用activity的預設佈局定義了兩個元件(widget):RelativeLayout和TextView。 元件是使用者介面的構造模組。元件可以顯示文字或影象,與使用者互動,甚至佈置螢幕上的其 他元件。按鈕、文字輸入控制元件和選擇框等都是元件。 Android SDK內建了多種元件,通過配置各種元件可獲得所需的使用者介面及行為。每一個組 件都是View類或其子類(如TextView或Button)的一個具體例項。
下面介紹一些常用的元件屬性。
(1). android:layout_width和android:layout_height屬性
幾乎每類元件都需要android:layout_width和android:layout_height屬性。以下是它們的兩個常見屬性值(二選一)。
match_parent:檢視與其父檢視大小相同。
wrap_content:檢視將根據其顯示內容自動調整大小。
TextView元件比其包含的文字內容區域稍大一些,這主要是android:padding="24dp"屬性的作用。該屬性告訴元件在決定大小時,除內容本身外,還需增加額外指定量的空間。這樣螢幕上顯示的問題與按鈕之間便會留有一定的空間,使整體顯得更為美觀。
(2). android:orientation屬性
android:orientation屬性是兩個LinearLayout元件都具有的屬性,它決定兩者的子元件是水平放置還是垂直放置。子元件的定義順序決定其在螢幕上顯示的順序。在垂直的LinearLayout中,第一個定義的子元件出現在螢幕的最上端;而在水平的LinearLayout中,第一個定義的子元件出現在螢幕的最左端。
(3). android:text屬性
TextView與Button元件具有android:text屬性。該屬性指定元件要顯示的文字內容。android:text屬性值不是字串值,而是對字串資源(string resource)的引用。
字串資源包含在一個獨立的名叫strings的XML檔案中(strings.xml),雖然可以硬編碼設定 元件的文字屬性值,如android:text="True",但這通常不是個好主意。比較好的做法是:將文字內容放置在獨立的字串資源XML檔案中,然後引用它們。
之後建立剛剛說到的字串資源。每個專案都包含一個預設字串資原始檔strings.xml。在專案工具視窗中,找到app/res/values目錄,展開目錄,開啟strings.xml檔案。然後在其中新增字串資源息。
2.從佈局 XML到檢視物件
activity_quiz.xml中的XML元素轉換為檢視物件在於QuizActivity 類。在建立GeoQuiz專案的同時,嚮導也建立了一個名叫QuizActivity的Activity子類。QuizActivity類檔案存放在專案的app/java目錄下。java目錄是專案全部Java原始碼的存放處。在專案工具視窗中,依次展開app/java目錄與com.bignerdranch.android.geoquiz包。找到並開啟QuizActivity.java檔案,檢視其中的程式碼。它實際就是一個Activity子類,能為Android舊版本系統提供相容支援。該Java類檔案有一個Activity方法:onCreate(Bundle)。 activity子類的例項建立後,onCreate(Bundle)方法會被呼叫。activity建立後,它需要獲取 並管理使用者介面。要獲取activity的使用者介面,可呼叫以下Activity方法: public void setContentView(int layoutResID) 根據傳入的佈局資源ID引數,該方法生成指定佈局的檢視並將其放置在螢幕上。佈局檢視生成後,佈局檔案包含的元件也隨之以各自的屬性定義完成例項化。
資源與資源 ID
佈局是一種資源。資源是應用非程式碼形式的內容,如影象檔案、音訊檔案以及XML檔案等。
專案的所有資原始檔都存放在目錄app/res的子目錄下。在專案工具視窗中可以看到,activity_quiz.xml佈局資原始檔存放在res/layout/目錄下。strings.xml字串資原始檔存放在 res/values/目錄下。
可以使用資源ID在程式碼中獲取相應的資源。activity_quiz.xml佈局的資源ID為R.layout. activity_quiz。
3.元件的實際應用
按鈕有了資源ID,就可以在QuizActivity中直接獲取它們。首先,在QuizActivity.java檔案中增加兩個按鈕成員變數。此時有錯誤提示:Cannot resolve symbol 'Button' 。此時需要在QuizActivity.java檔案中匯入android.widget.Button類包。可在檔案 頭部手動輸入以下程式碼: import android.widget.Button; 或者使用Option+Return(Alt+Enter)組合鍵,讓Android Studio自動匯入。
元件設定好之後便可以進行引用。在activity中,可呼叫以下Activity方法引用已生成的元件: public View findViewById(int id) 該方法以元件的資源ID作為引數,返回一個檢視物件。
設定監聽器。為響應某個事件而創 建的物件叫作監聽器(listener)。監聽器會實現特定事件的監聽器介面(listener interface)。無需自己動手,Android SDK已經為各種事件內建了很多監聽器介面。當前應用需要監聽使用者的按鈕“點選”事件,因此監聽器需實現View.OnClickListener介面。 (這個地方和之前接觸到的iOS的oc語言似乎有一點相似。 )
附:QuizActivity.jaca程式碼
package com.bignerdranch.android.geoquiz;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
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); mTrueButton.setOnClickListener(new View.OnClickListener() {//最外層一對括號內的全部程式碼就是傳入setOnClickListener (OnClickListener)方法的引數 @Override public void onClick(View v) { Toast.makeText(QuizActivity.this, R.string.correct_toast, Toast.LENGTH_SHORT).show(); } }); mFalseButton = (Button) findViewById(R.id.false_button); mFalseButton.setOnClickListener(new View.OnClickListener() {//最外層一對括號內的全部程式碼就是傳入setOnClickListener (OnClickListener)方法的引數 @Override public void onClick(View v) { Toast.makeText(QuizActivity.this, R.string.incorrect_toast, Toast.LENGTH_SHORT).show(); } }); }
}
這裡,一個匿名內部類(anonymous inner class)實現了OnClickListener介面。
監聽器以匿名內部類來實現有兩大好處。第一,使用匿名內部類,可以相對集中地實現監聽器方法,一眼可見;第二,事件監聽器一般只在一個地方使用,使用匿名 內部類,就不用去建立繁瑣的命名類了。
4. 建立提示訊息
分別點選兩個按鈕,彈出我們稱之為toast的提示訊息。Android的toast 是用來通知使用者的簡短彈出訊息,使用者無需輸入什麼,也不用做任何干預操作。
呼叫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訊息。
到此為止可以進行應用程式的運行了,但是由於電腦原因模擬器無法執行,所以也就沒能看一看最終的成果。
通過這一個小程式的設計,對Android應用程式有了一個初步的認識,對程式的設計流程和層次設計也加深了了解。並且在做的過程中,由於視覺化元素的存在,發現還是挺容易產生興趣的