Ch02 Android 程式設計基礎

Download Report

Transcript Ch02 Android 程式設計基礎

物件導向系統實務
*完成第一個App專案
*了解Android App專案架構
*查詢SDK技術文件
*程式的錯誤類型和除錯方法
完成第一個 App專案
Step 1. 設計畫面
Step 2. 元件程式設計
3
我們要利用這三種介面元件,完成如下圖的操作畫面,我們
必須在主程式的介面佈局檔中建立3個TextView元件、2個
EditText元件和1個Button元件
4
完成第一個 App專案
Step 1. 設計畫面
Step 2. 元件程式設計
5
TextView介面元件的功能是顯示訊息,使用者無法編輯其中
的文字,我們可以依照如下的語法格式在介面佈局檔中加入
TextView元件
<TextView android:id="@+id/自訂元件名稱"
android:屬性="屬性值"
․․․
/>
這是xml的語法,TextView是標籤名稱,後面則是它的屬性。
第一個屬性android:id是設定這個TextView元件的名稱,它
的值「@+id /自訂元件名稱」其中的「@+id /」是一個指令,
指示要將後面的元件名稱加入程式資源R中的id類別
6
<TextView android:id="@+id/txtResult"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="程式執行結果"
/>
增加一個名為txtResult的TextView元件,它的寬度是填滿它
所在的外框。它的高度則由文字的高度來決定,元件中會顯
示「程式執行結果」這個字串。
7
在決定介面元件的id名稱時,為了在程式碼中
能夠清楚的知道該介面元件的種類,我們可
以在元件名稱的前面加上小寫的元件型態的
縮寫,例如我們把上述TextView元件取名為
txtResult,前面的3個小寫英文字母txt表示這
是一個TextView介面元件。
8
EditText元件可以讓使用者在上面編輯文字,再讓程式讀取
該字串,我們可以依照如下的語法格式在介面佈局檔中加入
EditText元件
<EditText android:id="@+id/自訂元件名稱"
android:屬性="屬性值"
․․․
/>
和前面的TextView元件的語法比較,二者除了標籤名稱不同
以外其餘的格式都一樣
9
<EditText android:id="@+id/edtSex"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:text=""
/>
上面的範例中新出現了一個android:inputType屬性,它是用
來限制這個元件中可以輸入的字元類型,text表示任何字元
都可以接受,如果設定成number則只能輸入0~9的數字字元。
10
Button元件是讓使用者按下以啟動程式的某一項功能,我們
可以依照如下的語法格式在介面佈局檔中加入EditText元件
<Button android:id="@+id/自訂元件名稱"
android:屬性="屬性值"
․․․
/>
11
<Button android:id="@+id/btnDoSug"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="執行"
/>
會在手機螢幕上建立一個按鈕,按鈕上面顯示「執行」。
12
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/andr
oid"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height=“match_parent” >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sex"
android:textSize="25sp" />
<EditText
android:id="@+id/edtSex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/edt_sex_hint" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/age"
android:textSize="25sp" />
<EditText
android:id="@+id/edtAge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number"
android:hint="@string/edt_age_hint" />
<Button
android:id="@+id/btnOK"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/btn_ok"
android:textSize="25sp" />
<TextView
android:id="@+id/txtR"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp" />
</LinearLayout>
13
完成第一個 App專案
Step 1. 設計畫面
Step 2. 元件程式設計
14
Android App專案架構
15
第一行程式碼:
package com.myandroid.myfirstandroidapp;
是指定這個程式檔是屬於哪一個套件。接下來的import程式
碼段落是指定這個程式檔使用的類別或套件:
import android.support.v7.app.ActionBarActivity;
import …
16
接著是定義主程式類別,也就是程式開始執行的地方,它的名稱叫做
MainActivity,是我們在建立App專案的對話盒中指定的名稱:
public class MainActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public boolean onCreateOptionsMenu(Menu menu) {…}
public boolean onOptionsItemSelected(MenuItem item) {…}
}
這個MainActivity類別中有3個方法,依序是onCreate() 、
onCreateOptionsMenu()和onOptionsItemSelected()。這3個方法是狀態
處理方法,在MainActivity物件執行的過程中,會在不同的時間點被呼叫
執行。onCreate()是當MainActivity物件產生的時候(也就是程式啟動的
時候),被Android系統呼叫執行。onCreate()方法中的第一行程式
super.onCreate(savedInstanceState)是呼叫基礎類別的onCreate(),下
一行程式碼是呼叫setContentView()方法,並指定使用介面佈局檔
R.layout.activity_main。這個介面佈局檔是在「res/layout」資料夾裡17
頭。
介面元件和程式碼之間必須能夠互動以完成下列3件事:
1.從edtSex和edtAge元件中取得使用者輸入的性別和年齡;
2.當使用者按下「確定」按鈕時,開始執行判斷的程式碼;
3.把判斷的結果顯示在txtR元件中。
18
我們將建立在介面佈局檔中的標籤像是<TextView>、
<EditText>、<Button>和<LinearLayout>稱為「介
面元件」,為了在程式中使用這些「介面元件」,
我們必須在程式碼中建立對應到它們的「物件」,
這些用來對應到「介面元件」的「物件」必須和它
們所對應的「介面元件」具備相同的型態。
EditText mEdtSex, mEdtAge;
TextView mTxtR;
Button mBtnOK;
mEdtSex = (EditText) findViewById(R.id.edtSex);
mEdtAge = (EditText) findViewById(R.id.edtAge);
mTxtR = (TextView) findViewById(R.id.txtR);
mBtnOK = (Button) findViewById(R.id.btnOK);
19
Android這種圖形介面的程式架構就是利用各式各樣的事件
處理程序來執行使用者的操作,而事件處理程序在Android
程式中就稱為事件listener。要設定Button元件的事件
listener需要完成下列3個步驟:
Step 1. 建立一個Button的OnClickListener物件
View.OnClickListener btnOKOnClick = new
View.OnClickListener() {
public void onClick(View v) {
// 按下按鈕後要執行的程式碼
…
}
}
20
Step 2.把以上建立的OnClickListener物件設定給Button物件,
這樣按下該按鈕後就會執行其中的程式碼。
mBtnOK.setOnClickListener(btnOKOnClick);
21
public class MainActovotu extends Activity {
private Button mBtnOK;
private EditText mEdtSex, mEdtAge;
private TextView mTxtR;
mTxtR =
(TextView)findViewById(R.id.txtR);
// 設定button元件的事件listener
mBtnOK.setOnClickListener(
btnOKOnClick);
@Override
public void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 從資源類別R中取得介面元件
mBtnOK =
(Button)findViewById(R.id.btnOK);
mEdtSex =
(EditText)findViewById(R.id.edtSex);
mEdtAge =
(EditText)findViewById(R.id.edtAge);
}
private View.OnClickListener
btnOKOnClick = new
View.OnClickListener() {
public void onClick(View v) {
// 按下按鈕後要執行的程式碼
…
}
};
}
22
可以利用EditText物件本身提供的getText()方法來取得字串,
然後把字串資料轉成String型態存入一個String物件中。我們
也可以利用同樣的方法取得edtAge中的字串,不過因為年齡
應該是數值型態,所以我們再將得到的String物件轉成int型
態的資料
String strSex = mEdtSex.getText().toString();
int iAge = Integer.parseInt(mEdtAge.getText().toString());
23
將結果顯示在txtResult介面元件
將程式要顯示的訊息存入一個String物件,再把該物件利用
mTxtR物件的setText()方法設定給它即可。
String strSug = “程式的執行結果”;
mTxtR.setText(strSug);
24
private View.OnClickListener btnOKOnClick
= new View.OnClickListener () {
public void onClick(View v) {
// 按下按鈕後要執行的程式碼
String strSex =
mEdtSex.getText().toString();
int iAge =
else
if (iAge < 25)
strSug += "不急";
else if (iAge > 30)
strSug += "趕快結婚";
else
strSug += "開始找對象";
Integer.parseInt(mEdtAge.getText().toString());
mTxtR.setText(strSug);
}
String strSug = "結果:";
if (strSex.equals("男"))
if (iAge < 28)
strSug += "不急";
else if (iAge > 33)
strSug += "趕快結婚";
else
strSug += "開始找對象";
};
25
package com.example.showdata2;
//import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView nameTxt, resultTxt;
EditText nameEdt;
Button btn1, btn2;
float size;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameTxt = (TextView)findViewById(R.id.txt1);
nameEdt = (EditText)findViewById(R.id.edt1);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
resultTxt = (TextView)findViewById(R.id.txt2);
size = resultTxt.getTextSize();
btn2.setOnClickListener(new Button.OnClickListener()
{ public void onClick(View v)
{
resultTxt.setTextSize(--size);
resultTxt.setText(nameEdt.getText().toString()+ "拜拜!");
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void bigger(View v)
{
resultTxt.setTextSize(++size);
resultTxt.setText(nameEdt.getText().toString()+", 好!");
}
}
查詢SDK技術文件
29
1.
2.
3.
在安裝Android SDK的資料夾中有許多程式設計相關
的參考資料,有關類別相關的技術文件是放在docs資
料夾裡頭,用網頁瀏覽器開啟其中的index.html就可
以看到Android developers的首頁。
此外也可以利用網際網路連到Android developers網
站,該網站同樣也可以查詢Android SDK的說明文件。
電腦中的資料和Android developers網站上的資料的
差異是電腦上的資料不會自動更新,但是Android
developers網站上的資料會由Google公司負責持續地
更新。
30
1.
2.
如果是要查特定
套件的資料,請
點選網頁左邊上
方的「Package
Index」
如果想要直接查
詢特定的類別,
可以點選網頁左
邊上方的「Class
Index」
31
3.
4.
利用畫面右上方的Search按鈕,在該按鈕左邊的欄位輸入
類別名稱,輸入的同時在下方會出現參考清單
在Search功能的下面有一個Filter by API Level選項,如果
勾選它,然後在右邊的下拉式清單中選擇一個API Level
版本,就會發現網頁左邊的套件清單中有些變成灰色。這
項功能是說如果把程式專案的Minimum SDK屬性設定成
這個API Level版本,這些灰色的套件就不能使用。
32
由於Android SDK的所有類別都是以物件導向技術
的繼承方式產生,在每一個類別說明頁的最上方都
會有一個繼承的階層圖。如果在目前的類別說明頁
中查不到想要的屬性或是方法,就表示該屬性或方
法是定義在它所繼承的基礎類別中,這時候可以依
照繼承的階層圖查閱它的基礎類別。
33